Печать различных целых чисел в массиве - PullRequest
0 голосов
/ 23 марта 2009

Я пытаюсь написать небольшую программу, которая печатает различные числа в массиве. Например, если пользователь введет 1,1,3,5,7,4,3, программа выведет только 1,3,5,7,4.

Я получаю сообщение об ошибке в строке else if в функции checkDuplicate.

Вот мой код:

import javax.swing.JOptionPane;

public static void main(String[] args) {
    int[] array = new int[10];
    for (int i=0; i<array.length;i++) {
        array[i] = Integer.parseInt(JOptionPane.showInputDialog("Please enter"
                                  + "an integer:"));
    }
    checkDuplicate (array);
}

public static int checkDuplicate(int array []) {
    for (int i = 0; i < array.length; i++) {
        boolean found = false;
        for (int j = 0; j < i; j++)
            if (array[i] == array[j]) {
                found = true;
                break;
            }
        if (!found)
            System.out.println(array[i]);
    }
    return 1;
}
}

Ответы [ 8 ]

10 голосов
/ 23 марта 2009

Самый простой способ - добавить все элементы в Set<Integer>, а затем просто распечатать содержимое Set.

.
4 голосов
/ 23 марта 2009

Прежде всего, оператор "else if" неверен, поскольку вы не предоставляете никаких условий для if (если вы хотите if, вам нужно написать "if (condition) ...").

Во-вторых, вы не можете решить внутри внутреннего цикла , нужно ли печатать значение: как работает ваш код, вы пишете массив значений [i] для каждого массива значений [j] , что отличается от массива [i]!

В-третьих: внутренний цикл должен только перейти от 0 к внешнему индексу i-1: Для каждого элемента вам нужно только решить, является ли это первым вхождением (то есть, произошло ли то же значение в любом предыдущем индексе или не). Если это так, распечатайте его, если нет, игнорируйте его.

Правильная реализация CheckDuplicate() будет:

public static void checkDuplicate(int array []) {
  for (int i = 0; i < array.length; i++) {
    boolean found = false;
    for (int j = 0; j < i; j++)
      if (array[i] == array[j]) {
        found = true;
        break;
      }
    if (!found)
      System.out.println(array[i]);
  }
}

Но, конечно, какой-то Set будет гораздо эффективнее для больших массивов ...


EDIT: Конечно, mmyers (см. Комментарии) правы, говоря, что, поскольку CheckDuplicate() не возвращает никакого значения, он должен иметь тип возврата void (вместо int). ). Я исправил это в приведенном выше коде ...

3 голосов
/ 23 марта 2009

Поместите их в набор, упорядоченный по времени вставки, затем при необходимости преобразуйте обратно в массив.

new LinkedHashSet<Integer>(array).toArray()
2 голосов
/ 23 марта 2009

То, что вы хотите, может быть достигнуто с помощью API сбора Java, но не совсем как однострочный, потому что методы сбора фактов работают с Object s, а не с примитивами. В J2SE отсутствуют методы, которые конвертируют, скажем, int[] в Integer[], но библиотека Apache Commons Lang содержит такие полезные методы, как ArrayUtils.toObject () и ArrayUtils. ToPrimitive () .

Используя их, метод удаления дублированных элементов из целочисленного массива выглядит примерно так:

public static int[] removeDuplicates(int... array) {
    Integer[] ints = ArrayUtils.toObject(array);
    Set<Integer> set = new LinkedHashSet<Integer>(Arrays.asList(ints));
    return ArrayUtils.toPrimitive(set.toArray(new Integer[set.size()]));
}

Если ваше приложение может включать в себя больше манипуляций с массивами / коллекциями, я предлагаю вам взглянуть на эту библиотеку, а не реализовывать вещи с нуля. Но, если вы делаете это в учебных целях, напишите код!

2 голосов
/ 23 марта 2009

Попробуйте бросить все целые числа в набор. Дубликаты никогда не будут добавлены в набор, и у вас останется набор уникальных целых чисел.

1 голос
/ 24 марта 2009

Либо используйте Набор, как предлагали другие люди, либо используйте класс, совместимый с List. С помощью списка совместимых классов просто используйте метод Contains, чтобы проверить, существует ли он уже в массиве.

1 голос
/ 23 марта 2009

Вероятно, было бы лучше добавить каждое число к реализации Set , а не к массиву. Наборы специально предназначены для хранения коллекций элементов, в которых вы хотите отфильтровать дубликаты.

0 голосов
/ 07 апреля 2013

импорт java.util.Scanner; открытый класс PrintDistinctNumbers {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    int [] numberArray = createArray();
    System.out.println("The number u entered are:   ");
    displayArray(numberArray);
    getDistinctNumbers(numberArray);
}

public static int[] createArray() {
    Scanner input = new Scanner(System.in);
    int [] numberCollection = new int [10];
    System.out.println("Enter 10 numbers");

    for(int i = 0; i < numberCollection.length; i++){
        numberCollection[i] = input.nextInt();
    }
    return numberCollection;

}

public static void displayArray(int[] numberArray) {
    for(int i = 0; i < numberArray.length; i++){
        System.out.print(numberArray[i]+" ");
    }
}

public static void getDistinctNumbers(int[] numberArray) {
    boolean isDistinct = true;
    int temp = 0;
    int [] distinctArrayNumbers = new int [10];
    for ( int i = 0; i < numberArray.length; i++){
        isDistinct = true;
            temp = numberArray[i];

            for( int j = 0; j < distinctArrayNumbers.length; j++){
                if( numberArray[i] == distinctArrayNumbers[j] ){
                isDistinct = false;
            }


           }
            if(isDistinct){
                    distinctArrayNumbers[temp]=numberArray[i];
                    temp++;
                }


    }
    displayDistinctArray(distinctArrayNumbers);
}

public static void displayDistinctArray(int[] distinctArrayNumbers) {
    for( int i = 0; i < distinctArrayNumbers.length; i++){
        if(distinctArrayNumbers[i] != 0){
        System.out.println(distinctArrayNumbers[i]);
        }
    }
}

}

...