regex i tablica danych char

regex i tablica danych char
CR
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 6 lat
  • Postów:28
0

Witam,

Mam problem z zadaniem, w którym mam napisać metodę zwracającą wartość true gdy dostarczony argument zawiera znaki reprezentujące liczby lub false w przeciwnym wypadku.
Wydaję mi się, że dobrze zrozumiałem zadanie i teoretycznie dla poniższych wartości w tabeli wszystko się kompiluje i otrzymuję zgodnie z oczekiwaniem wynik false, ale gdy tylko dodam kolejną wartość w tabeli (np. char tab[] = {'a', 'Z', '9', 'b'}, to program w ogóle się nie kompiluje i nic się nie dzieje.

Powiedzcie proszę czy w ogóle ten sposób rozwiązania jest sensowny, a jeśli tak to w czym tkwi błąd w poniższym kodzie.

Kopiuj
import java.util.regex.*;

public class Program {
	public static void main(String[] args){
		
		char tab[] = {'a', 'Z', '9'};
		
		System.out.println(method(tab));
		
		for (char i : tab)
			System.out.print(i+" ");		
	}
	
	public static boolean method(char[] data){
		
		boolean result = true;
		
		while (result){
			for (char i : data){
				String test = String.valueOf(i);
				Pattern pattern = Pattern.compile("\\D");
				Matcher matcher = pattern.matcher(test);
				result = matcher.matches();
			}	
		}
		return result;
	}
}

Pozdrawiam,

edytowany 2x, ostatnio: crystalsky
szweszwe
  • Rejestracja:ponad 11 lat
  • Ostatnio:14 dni
  • Lokalizacja:Kraków
  • Postów:1694
1

Dlaczego false jest dobrym wynikiem skoro masz w tablicy 9. Po co Ci pętla while? To ona po dodaniu 4 elementu chodzi w nieskończoność - program się kompiluje w przeciwieństwie do tego co napisałeś.

CR
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 6 lat
  • Postów:28
0

Pomyliłem w tym wypadku i przyjąłem w programie odwrotne warunki.
while chciałem wstawić na początku ze względu na to, żeby przerwał pętle jak tylko znajdzie odpowiednią wartość, ale widzę, że rzeczywiście niepotrzebny był.

Teraz chyba już jest ok :).

Kopiuj
 import java.util.regex.*;

public class Program {
	public static void main(String[] args){
		
		char tab[] = {'a', 'Z', '9', 'A'};
		
		System.out.println(method(tab));
		
		for (char i : tab)
			System.out.print(i+" ");		
	}
	
	public static boolean method(char[] data){
		
		boolean result = false;
		
			for (char i : data){
				String test = String.valueOf(i);
				Pattern pattern = Pattern.compile("\\d");
				Matcher matcher = pattern.matcher(test);
				result = matcher.matches();
				if (result == true)
					return result;
			}	
		return result;
	}
}

Dziękuję za pomoc :).

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Jest bardzo źle, Twoja funkcja method zwraca true jeżeli znajdzie choć jedną cyfrę a powinna zwracać true tylko wtedy gdy wszystkie znaki są poprane.
Program niepotrzebnie korzysta z wyrażeń regularnych do sprawdzenia czy znak jest cyfrą.

Kopiuj
public class Program {
    public static void main(String[] args){
 
        char tab[] = {'a', 'Z', '9', 'A'};
 
        System.out.println(method(tab));
       
        for (char i : tab)
            System.out.print(i+" ");        
    }
 
    private static boolean method(char[] data){
        for (char i : data){
            if(!Character.isDigit(i)){
                return false;
            }
        }   
        return true;
    }
}

Spytaj też prowadzącego, co u niego jest liczbą?

  • -567, czy dopuszczalne są ujemne,
  • 56,45
  • 56.45, czy dopuszczalne są ułamkowe, a jeśli tak, to co jest separatorem,
  • .45, czy dopuszczalne jest pominięcie zerowej części ułamkowej, całkowitej).

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 2x, ostatnio: bogdans
PI
CR
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 6 lat
  • Postów:28
0

Rozumiem Twój tok myślenia, ale zakładając, że nie jest jasno sprecyzowane (powiedziane jest, że zawiera, a nie, że wszystkie jego wartości są znakami reprezentującymi liczby) i moje założenie jest zgodne z oczekiwaniami, to czy dla warunku, że przynajmniej jedna z wartości jest liczbą to kod nie jest poprawny?
Tak z ciekawości pytam.

edytowany 1x, ostatnio: crystalsky
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
1

Moim zdaniem jest źle, gdyby chodziło o pojedyncze znaki, to w sformułowaniu zadania byłoby znaki reprezentujące cyfry. Jesteś pewien, że treść zadania nie jest taka: znaki reprezentujące liczbę.
Przy Twoim rozumieniu zadania, kod jest poprawny. Ale użycie wyrażeń regularnych, to strzelanie z armaty do muchy.

Kopiuj
    private static boolean method(char[] data){
        for (char i : data){
            if(Character.isDigit(i)){
                return true;
            }
        }   
        return false;
    }

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
CR
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 6 lat
  • Postów:28
0

Przypuszczam, że masz rację, a nawet jeśli nie, to dobrym ćwiczeniem będzie napisanie kodu uwzględniającego wypisane przez Ciebie wcześniej warunki co też w ramach własnego rozwoju przerobię. Dzięki zatem za uwagi i wskazówki, i za uproszczenie mojego topornego rozwiązania :)

Pozdrawiam,

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.