Вопрос

Я пытаюсь написать небольшую программу, которая выводит различные числа в массив.Например, если пользователь введет 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;
}
}
Это было полезно?

Решение

Прежде всего, "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 было бы намного эффективнее для больших массивов...


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

Другие советы

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

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

new LinkedHashSet<Integer>(array).toArray()

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

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

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

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()]));
}

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

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

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

импортировать java.util.Сканер;открытый класс 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]);
        }
    }
}

}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top