• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

problem z kompilacją Java String-2 xyzThere

VPS Starter Arubacloud
0 głosów
203 wizyt
pytanie zadane 28 października 2021 w Java przez Joshe Początkujący (280 p.)

Witam, treść zadania poniżej:

Return true if the given string contains an appearance of "xyz" where the xyz is not directly preceeded by a period (.). So "xxyz" counts but "x.xyz" does not.


xyzThere("abcxyz") → true
xyzThere("abc.xyz") → false
xyzThere("xyz.abc") → true

public boolean xyzThere(String str) {
  String xyz = "xyz";
  
  if(str.length()<3){
    return false;
  }
  for(int i=0;i<str.length()-2;i++){
    String temp = str.substring(i,i+3);
    int sign = str.charAt(i-1);
    if(i>=0){
      if(sign != 46 && temp.compareTo(xyz)== 0){
        return true;
      }
    }
  }
    return false;
}

błąd kompilacji działa wyłącznie dla str.length()<3. Pozostała reszta wypluwa mi StringIndexOutOfBoundsException: String index out of range: -1 (line:9). Rozumiem, że to chodzi o tego inta sign. Zamysł był żeby wyciągnąć znak, wcześniejszy do warunku fałsz miała być to kropka rozpoczynająca stringa "xyz"

Proszę o pomoc.

komentarz 28 października 2021 przez Oscar Nałogowiec (29,320 p.)
To nie jest błąd kompilacji tylko błąd wykonania.
komentarz 29 października 2021 przez Wiciorny Ekspert (275,640 p.)
swoją drogą totalnie tego nie rozumiem, ktoś robi chyba dla nauki "zadania" problematyczne z rozwiązaniem pewnego "point-problemu" a nie pisze kodu samodzielnie, tylko kopiuje i to jeszcze z błędami...

1 odpowiedź

0 głosów
odpowiedź 28 października 2021 przez Wiciorny Ekspert (275,640 p.)
wybrane 29 października 2021 przez Joshe
 
Najlepsza
str.substring(i,i+3);

a pomyśl dlaczego substring wyrzuci Ci błąd jak będzie na przedostatnim elemencie, a ma zwrócić następne i+3 :) 

dalej błąd kompilacji,  jeśli twoje i jest zbyt długie a jest... to widać wprost - i to substring zwraca błąd zanim błąd zwrócić może też charAt

str.charAt(i-1)

Generalnie jakbyś kod pisał samemu, to byś wiedział dlaczego jest źle... bo odpowiedź masz we wskazanym błędzie ...ten kod jest nie należy do Ciebie : http://www.javaproblems.com/2013/11/java-string-2-xyzthere-codingbat.html

Ty się nie musisz przejmować jakie ciągi się tu znajdują do wystapienia pierwszej kropki :) ... pomyśl, jeśli dopiero pojawi się kropka trzeba przeanalizować ciąg czy coś znajduje się przed i czy po kropce następne trzy znaki to "Xyz" nic więcej :) 
Akurat jeszcze wartości "UJEMNE" dla twojego błędu wskazują na to, że początkowy indeks jest zbyt blisko końca i następne elementy nie mogą być wycięte bo nie istnieją 

dla xyz np 

System.out.println(str.substring(0,4)); // zwróci ci  index 1 błędnie 
System.out.println(str.substring(2,1)); // zwroci ci -1 
// dlaczego -1? bo dla xyz, pozycja 2 to "z"
// i po z nie występuje nic a chcesz pobrać

 

komentarz 29 października 2021 przez Joshe Początkujący (280 p.)

Na przykładach z internetu staram się to zrozumieć..

dla mnie jeśli szukam stringa 3 elementowego "xyz" to oczywisty jest zapis

str.substring(i,i+3)

tj. od i i trzy kolejne znaki, które mogą być "xyz"

Piszesz, że jeśli będzie na przedostatnim miejscu to wyrzuci mi błąd

to powinienem od długości maksymalnie 3 znaki odjąć? przykład poniżej.

for(int i=0, i<str.length()-3;i++)

czy jak to rozumieć? a i jeszcze co może być źle w str.charAt(i-1)?

gdzieś po drodze jakieś braki w rozumieniu działania tych zapisów i trudno mi posklejać jakiekolwiek zadanie

komentarz 29 października 2021 przez Wiciorny Ekspert (275,640 p.)
edycja 29 października 2021 przez Wiciorny
str.substring(i,i+3)

ale tutaj szukasz po  iteracji i, więc wyobraź sobie sytuacje w twojej pętli for. 

for(int i=0, i<str.length()-3;i++)

str.length() na stringu "xyz"  zwróci Ci 3 potem   -3 => zwróci 0, pętla się nie wykona  

twoje przykłady są dłuższe, zauważ 

xyzThere("abcxyz")  // długość length => 6

więc dla tego przykładu iterujesz od 0 - > do 6-3 czyli do 3 włącznie bez 

czyli od i=0 do i<3  ostatni    str.substring(i,i+3) wynosić zatem będzie i=2, następnie od i=2 pobrać chcesz do inteksu nr 5  ( bo 2 (iterator) +3) - to daje ci ciąg od drugiego elementu 2, pobierz do 5 pozycji i tu jest okej. 

Natomiast jest pewien problem dla elementu  kiedy zwiększa CI się liczba liter dla 7 :)

iterator jest na 4 pozycji już i tu może być błąd natomiast 

int sign = str.charAt(i-1); dlaczego tu jest błąd no bo   co zwróci Ci dla indeksu 0?

Jakbyś pisał aplikacje sam widział byś to w deburzegrze 

   for(int i=0;i<str.length()-2;i++){
            String temp = str.substring(i,i+3);   // i = 0 pierwsza iteracja 
            int sign = str.charAt(i-1);  // str.charAt(-1)

            int sign = str.charAt(i-1);  // str.charAt(-1)

nie możesz znaleźć znaku dla str.charAt -1 bo nie istnieje 

  if(i>=0) // ten warunek po co? 

ten warunek nigdy nie jest fałszem, zawsze jest prawdą, więc jest niepotrzebny. 
Przeanalizuj to na dole 

public boolean xyzThere(String str) {
     //dodaj jeszcze inny warunek uwzględniający pierwsze indeksy   
    for(int i = 1; i < str.length() - 2; i++) {
        if(str.charAt(i - 1) != '.' && str.substring(i, i + 3).equals("xyz"))
            return true;
    }
                          
    return false;
}

I jak prosisz o pomoc to -> zamieszczaj swój kod źródłowy, bo jeśli byś pisał sam - > problem byś znalazł 

komentarz 30 października 2021 przez Joshe Początkujący (280 p.)

Dziękuję bardzo za pomoc i rozjaśnienie tematu. Udało się napisać kod, który się kompiluje...

public boolean xyzThere(String str) {
  
  if(str.length()<3){
  return false;
  }
  if(str.substring(0,3).equals("xyz")){
    return true;
  }
  for(int i=1;i<str.length()-2;i++){
    if(str.charAt(i-1) != '.' && str.substring(i,i+3).equals("xyz")){
      return true;
    }
  }
  return false;
}

Nie wiem czy dobrze dla innych różnych przypadków, ale dla tych podanych - rozwiązanie zaakceptowano.

U mnie trudność sprawiło  zrozumienie indeksowania z długością stringa i na odwrót.

Praktyka, praktyka i praktyka :) ...

Dzięki i pozdrawiam.

Podobne pytania

0 głosów
1 odpowiedź 233 wizyt
pytanie zadane 4 lipca 2018 w Java przez Programmingc100 Bywalec (2,620 p.)
0 głosów
1 odpowiedź 413 wizyt
pytanie zadane 8 grudnia 2019 w Java przez mm Użytkownik (890 p.)
0 głosów
1 odpowiedź 74 wizyt
pytanie zadane 6 lipca w Java przez Wojo772233 Początkujący (460 p.)

92,845 zapytań

141,786 odpowiedzi

320,861 komentarzy

62,178 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...