Tablica - czy istnieje dany wpis

0

Cześć,
chcę aby wprowadzane liczby nie powtarzały się w tablicy.
Robię to w ten sposób:

		btnNewButton.addMouseListener(new MouseAdapter() {
			int arr[] = new int[1000]; //tablica
			int counter2; //licznik
			@Override
			public void mouseClicked(MouseEvent e) {
				counter2 = 0; //zerowanie
				try{
				int zupa = Integer.parseInt(textField.getText()); //liczba z JTextField
				List<int[]> lista = Arrays.asList(arr);   //tablica na liste
				if(lista.contains(zupa)){ //sprawdzam czy lista zawiera wartość zupy
					JOptionPane.showMessageDialog(null, " powtórzyło sie");
				}else{ //a dalej to losowanie liczby, dodawanie do JList i tablicy
				Random asd = new Random(); 
				counter2 = counter2+1;
				arr[counter2] = asd.nextInt(zupa+1);
				model.addElement(arr[counter2]); 
				}
				}catch(NumberFormatException ec){
					JOptionPane.showMessageDialog(null, "Tylko liczby");
				}

			};

Niestety, ale ten kod nie działa. Jeżeli zrobiłem błąd gdzieś u podstaw programowanie - besztać. Nawet jeżeli nie to i tak krzyczeć, wtedy zapamiętam co napisaliście na 100% ;)

0

Część liczb wpisuje użytkownik, część jest losowana. Tylko przy wpisywanych sprawdzasz czy się nie powtarzają, przy losowanych nie.

0

Jako "liczba wprowadzana" miałem na myśli losowaną z przedziału, który użytkownik wpisuje do JTextFielda. :)

1

I co z tego? Użytkownik wpisze za pierwszym razem 5, Ty wylosujesz 3, za drugim razem wpisze 97 (nowa liczba), a Ty wylosujesz 3.

0

Pospiesznie przeczytałem i nie załapałem. :)
Nowy kod:

Random asd = new Random();
				counter2 = counter2+1;
				arr[counter2] = asd.nextInt(zupa+1);
				if(lista.contains(arr[counter2])){
					JOptionPane.showMessageDialog(null, "powtórzyło sie");
}else{
				model.addElement(arr[counter2]);
}

Wydaje mi się w porzadku, jednak nie wykonuje się poprawnie.

0

Co chcesz uzyskać? Tzn. co ma się znaleźć w modelu?

0
bogdans napisał(a):

Co chcesz uzyskać? Tzn. co ma się znaleźć w modelu?

Wylosowaną, niepowtarzającą się, liczbę.

0

Omg, jedną liczbę? To się na pewno nie powtórzy. Ile ma być liczb w modelu i z jakiego mają być zakresu?

0
bogdans napisał(a):

Omg, jedną liczbę? To się na pewno nie powtórzy. Ile ma być liczb w modelu i z jakiego mają być zakresu?

Zmęczenie daje mi sie we znaki :P
Oczywiście, że nie jedną liczbę, tyle liczb, ile razy użytkownik kliknie button. Zakres również podaje user.

0

Użytkownik podał zakres: od 1 do 10. Potem kliknął w przycisk 20 razy. Znasz 20 różnych liczb w przedziale [1,10]?

0

Ktoś z nas tutaj czegoś nie rozumie.
user image
Tak wygląda mój program. Chcę, aby z podanego zakresu żadna liczba sie nie powtarzała, nie ważne ile razy wcisne przycisk. Czyli jedno zero, jedna jedynka itd.
Próbuję zapobiec powtarzaniu w programie, jednak podany przeze mnie kod temu nie przeciwdziała. I tutaj przyszedłem po pomoc - jak to zrobić.

1
List<int[]> lista = Arrays.asList(arr);

Z tablicy tworzysz listę tablic, która zawiera tylko jeden element - całą tablicę (a nie wszystkie jej elementy). Z tego powodu nigdy nie znajdziesz w niej żadnej liczby. Chodziło ci o List<Integer>. Właściwie to po co ci do tego tablica i lista? Możesz przecież operować na samej liście (albo na zbiorze):

Set<Integer> numbers = new HashSet<>();
Random random = new Random();

@Override
public void mouseClicked(MouseEvent e) {
    int zupa = // ...
    int num = asd.nextInt(zupa + 1);

    if (numbers.contains(num)) {
        // ...
    } else {
        // przy okazji nie trzeba już żadnych liczników
        numbers.add(num);
        // ...
    }
}

Poza tym, dla mnie to bez sensu - użytkownik nie ma wpływu na to, czy wylosowana liczba jest już w liście. Czy nie powinieneś wtedy po prostu powtórzyć losowania (chyba że zajęte są już wszystkie liczby w danym przedziale)?

0

Użytkownik w polu zakres wpisał 10, wylosowałeś 0. Potem wpisał 9 wylosowałeś 1. Potem wpisał 1, co masz zamiar wylosować?
Imo, masz nierealizowalne wymagania.

0
iooi napisał(a):

Poza tym, dla mnie to bez sensu - użytkownik nie ma wpływu na to, czy wylosowana liczba jest już w liście. Czy nie powinieneś wtedy po prostu powtórzyć losowania (chyba że zajęte są już wszystkie liczby)?

Jasne, że tak zrobie, jednak brakowało mi sprawdzania czy liczba już jest wylosowana. :)
Dzięki wielkie, przy okazji poznam bliżej listy - nigdy nie operowałem na nich, a jest okazja.

0

możesz jeszcze wpisać do tablicy liczby w tym zakresie co chcesz pracować (kolejno), pomieszać liczby w tej tablicy, następnie wyciągać z tej tablicy kolejne liczby. Po wstępnym przeliczeniu odczyt później sprowadzi się do odczytania kolejnej liczby.

0

Jeśli mogą być kolejne liczby, to można wpisać liczby przy pomocy pętli, a potem wywołać metodę shuffle.

List<Integer> liczby = new List<Integer>();
for(int i=0;i<1000;i++)
   liczby.add(i);
Collections.shuffle(liczby);

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