Sprawdzanie powtarzalności liczb

0

Cześć,
utknąłem z prostym zadaniem i chciałbym prosić o wskazówkę. W poniższym programie wpisuję z konsoli 6 różnych liczb z przedziału <1-49>.
Następnie sprawdzam czy liczby się powtarzają. Jeśli tak, całą operację wykonuję od początku. W przypadku, jeżeli liczby się powtarzają, następuje zapętlenie w nieskończoność. O co chodzi i jak to rozwiązać. Warunek while z wykorzystaniem booleana jest najwidoczniej niepoprawny. Z kolei jeśli liczby są różne wszystko jest ok. P.S. w zadaniu chcę wykorzystać jedynie tablice.
Z góry dzięki za pomoc.

public class Draw {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        boolean sameNum;
        int i = 0;
        int[] tab = new int[6];

         do {
            System.out.print("Podaj 6 różnych cyfr z przedziału (1 - 49):");
            while (i < 6) {
                int num = sc.nextInt();
                if (49 < num || num < 1) {
                    System.out.println("Podaj liczbę z przedziału (1 - 49)");
                    num = sc.nextInt();
                }
                tab[i] = num;
                i++;
            }
            System.out.println("Podałeś następujące liczby " + Arrays.toString(tab));

            sameNum = false;
            for (i = 0; i < 6; i++) {
                for (int k = 0; k < 6; k++) {
                    if (tab[i] == tab[k]) {
                        if (i == k) {
                            continue;
                        }
                        sameNum = true;
                        break;
                    }
                }
            }
        } while (sameNum != false);
    }
}
2
Squick napisał(a):

wpisuję z konsoli 6 różnych liczb z przedziału <1-49>.
Następnie sprawdzam czy liczby się powtarzają. Jeśli tak, całą operację wykonuję od początku.

Masz Set<\Integer> set = new HashSet<>();
Dodajesz te 6 liczb do zbioru. Sprawdzasz set.size()==6
true - nie powtórzyły się
false - były jakieś powtórzenia, więc set.clear() i od początku

0

@BraVolt: Czy bez seta, korzystając jedynie z pętli da się to rozwiązać? Zamiast seta sprawdzam pętlą, czy liczby się powtarzają. Jeśli tak, wyrzuca true.
Mam problem jak wykorzystać tą informację później w pętli do - while, aby w przypadku powtarzających się liczb cały proces powtarzać tak długo, aż użytkownik wpisze różne liczby.

0

@Squick:

       boolean shouldContinue = true;
        while (shouldContinue) {
            // get 6 numbers
            shouldContinue = false;
        }

wczytujesz liczby...
Dopiero kiedy będziesz mieć 6 różnych liczb to shouldContinue=false;

4

Zaczni od podzielenie tego kodu na sensowne kawałki. Teraz masz problem bo wpakowałeś wszystko do jednego worka i nie wiadomo o co chodzi. Patrz np.:

while(true){
    int[] values = getNumbers();
    if(allUnique(values)){
        break;
    }
}

Dalej

int[] getNumbers(){
    int[] values = new int[6];
    for(int i=0;i<6;i++){
        int value = getInt();
        values[i]=value;
    }
   return values;
}

Lepiej się czyta?

Można tą logikę zapisać też trochę inaczej, np.:

while(true){
    int[] values = getNumbers();
    if(hasAllValuesSet(values)){
        break;
    }
}
//
int[] getNumbers(){
    int[] values = new int[6]{0,0,0,0,0,0};
    for(int i=0;i<6;i++){
        int value = getInt();
        if(isRepeated(value, values)){
            break;
        }else{
            values[i]=value;
        }
    }
   return values;
}

Gdzie hasAllValuesSet sprawdza czy wszystkie 6 wartości jest różne od 0 a isRepeated sprawdza czy value występuje już w tablicy values.
Co więcej w drugim przypadku można by trywialnie zamienić tablicę na Set a algorytm wyglądałby tak samo.

0

@Shalom: Dzięki. Teraz wszystko działa i wygląda jak powinno.

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