Jak się pozbyć zduplikowanych wartości w tablicy int?

głosy
2

Pytanie brzmi, jak mówi tytuł, w jaki sposób pozbyć się duplikatów wartości w tablicy liczb całkowitych? Chcę go mieć tak Wejścia użytkownika pięć numerów, wszystko w zakresie pomiędzy 10 a 100. Połów jest, że muszę mieć go tak, że jeżeli wartość ich wprowadzania została już wprowadzona do tablicy nie będą się liczyć. Oto kod mam tak daleko:

public static void main(String[]args){
    Scanner input = new Scanner(System.in);

    int[] intArray = new int[5]; //max of 5 values

    for(int i = 0; i < 5; i++){
        System.out.println(Please enter your desired number that is between 10 and 100: );
            intArray[i] = input.nextInt(); //puts the value into the array
        }
    System.out.println(Arrays.toString(intArray)); //for test purposes to make sure the array was correctly taking in the values
    }
}


    System.out.println(Arrays.toString(intArray)); //for test purposes to make sure the array was correctly taking in the values

Jestem zdezorientowany, w jaki chciałbym zrobić to tak, jeśli użytkownik wprowadza numer, który już istnieje w tablicy to po prostu nie je dodać. Oto przykład tego, co mam na myśli, że użytkownik wprowadza numery 15, 22, 46, 46, 77, gdy program jest zrobione zapętlenie pięciokrotnie będzie wydrukować następujący: [15, 22, 46, 77]. Siedzę w jaki sposób to zrobić. Również mam edytowany out if liczba wynosi między 10 a 100 if, aby była ona bardziej czytelna, a dostać się do głównego punktu w dłoni.

Utwórz 02/03/2015 o 23:13
użytkownik
W innych językach...                            


5 odpowiedzi

głosy
0

Jeśli po prostu trzeba wybrać unikalne numery od liczb, które użytkownik będzie wejście, nie przechowywać je w tablicy początkowo.

Zamiast przechowywać je w HashMap / Hashtable a następnie po zakończeniu wprowadzania danych przez użytkownika przekonwertować go na tablicy.

Innym sposobem osiągnięcia tego celu byłoby użyć zestaw kolekcja. Dodaj każdy numer, który otrzymałeś do instancji Zestawie i ostatecznie przekształcić zestaw do tablicy. Zestaw będzie utrzymywać wyjątkowość domyślnie.

public static void main(String[]args){
    Scanner input = new Scanner(System.in);
    int[] intArray = new int[5]; //max of 5 values
    Set<Integer> uniques = new HashSet<Integer>();
    for(int i = 0; i < 5; i++){
        System.out.println("Please enter your desired number that is between 10 and 100: ");
        uniques.add(input.nextInt()); //puts the value in the set
    }
    System.out.println(Arrays.toString(uniques.toArray())); //for test purposes to make sure the array was correctly taking in the values
}
Odpowiedział 02/03/2015 o 23:17
źródło użytkownik

głosy
0

Mówisz, że chcesz zmienną liczbę cyfr na końcu, więc tablica nie jest właściwym wyborem tutaj, zamiast używać ArrayList.

Coś jak:

List<Integer> intList = new ArrayList<Integer>();
int maxElements = 5; //Set max value here
for(int i = 0; i < maxElements ; i++)
{
    System.out.println("Please enter your desired number that is between 10 and 100: ");
    Integer newNumber = input.nextInt();
    if(newNumber  >= 10 && newNumber  <= 100)
    {
        Boolean found = false;
        foreach (Integer check : intList)
        {
            if (check == newNumber)
            {
                 found = true;
                 break;
            }
        }
        if (!found) intList.Add(newNumber);
    }
    else if(newNumber < 10 || newNumber > 100)
    {
        System.out.println("Enter a valid number next time, this number will not be counted in the results.");
    }
}

Duplikat sprawdzić : że wewnętrzna pętla dodałem sprawdza, czy istnieje inny element o tej samej wartości, a w takim przypadku pomija szereg jak pan powiedział.

Napisałem to bez komputera, więc może mam mieszane niektóre rzeczy, ale można uzyskać ogólne pojęcie.

Odpowiedział 02/03/2015 o 23:19
źródło użytkownik

głosy
-1
  1. Dokonanie tablicę rozmiarze 100 i za pomocą wejścia jako wskaźnika. przed aktualizacji tablicy wejściowy [] = wejście sprawdzić wartość wskaźnika (numer wejściowego) tablicy.

  2. Używaj wartości wejściowe mapa sklepów jako klucz. przed zapisać wartość w tablicy, należy sprawdzić, czy klucz jest w mapy, czy nie.

Odpowiedział 02/03/2015 o 23:19
źródło użytkownik

głosy
2

Co na temat korzystania z zestawu? LinkedHashSet, w szczególności, pozwala to zrobić w O (n) czasu i pamięci, zachowując kolejność wejść. I zanim powiesz „Ale nie mogę użyć HashSet,” trzeba jej zachowanie dla optymalnego rozwiązania, więc pytanie nawiązanie może być „Jak zaimplementować LinkedHashSet, ewentualnie pieczenie logiki w moim programie?”

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    Set<Integer> intSet = new LinkedHashSet<>();
    int[] intArray = new int[5]; //max of 5 values

    for (int i = 0; i < 5; i++) {
        System.out.println("Please enter your desired number that is between 10 and 100: ");
        intSet.add(input.nextInt());
    }

    int[] intArray = new int[intSet.size()];

    int i = 0;
    for (Integer val : intSet) {
        intArray[i++] = val;
    }
}
Odpowiedział 02/03/2015 o 23:25
źródło użytkownik

głosy
0

Jeden liner by osiągnąć to, co chcesz:

Set<Integer> noDuplicates = new LinkedHashSet<>(Arrays.asList(intArray));

Czy to po przeczytaniu wartości i przechowywać je w swoim intArray.

Jeśli chcesz zachować porządek, w których wartości zostały wprowadzone, należy użyć LinkedHashSet, w przeciwnym razie po prostu używać HashSet.

SetTo zbiór, który nie może mieć duplikaty.

Odpowiedział 03/03/2015 o 00:06
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more