regex i tablica danych char

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.

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,

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ś.

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 :).

 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 :).

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ą.

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).
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.

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.

    private static boolean method(char[] data){
        for (char i : data){
            if(Character.isDigit(i)){
                return true;
            }
        }   
        return false;
    }
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,

1 użytkowników online, w tym zalogowanych: 0, gości: 1