Поиск дубликатов в массиве Java - PullRequest
1 голос
/ 30 сентября 2011

В любом случае, у меня есть эта чрезвычайно простая Java-программа, чтобы узнать, совпадают ли 2 объекта в массиве.Однако когда я запускаю его, когда набор уникальных объектов всегда возвращает 1 ошибку, если я добавляю больше одинаковых объектов, это считается как обычно.

Это код;

int[] array= new int[] {1,245,324,523};

    int size = array.length;
    int error=0;
    System.out.println(error);

    int i = 0;
    for(i=0; i<size; i++){

        if(array[0] == array[i]){
            error= error +1;
        }
        System.out.println(error);
    }

Ответы [ 8 ]

5 голосов
/ 30 сентября 2011

Ошибка 1 состоит в том, что вы сравниваете array[0] с array[0], что, конечно, равно самому себе.

Если вы хотите найти все попарно дубликаты, вам нужно сделать двойной цикл:

for(int i=0;i<size;i++){
    for(int j=i+1;j<size;j++){
        if(array[i] == array[j]){
            if(i!=j){
                error = error + 1;
            }
        }
    }
}

Вы заметите несколько вещей из этого кода:

  • j начинается с i + 1, а не с 0.
  • error увеличивается только тогда, когда i! = J

Во-первых, вы по очереди сравниваете каждый элемент массива с каждым другим элементом. К тому времени, когда наступает его ход (во внешнем цикле), он уже сравнивается с элементами перед ним и не должен сравниваться с ними снова.

Во-вторых, вы в конечном итоге будете сравнивать элемент с самим собой для каждого внешнего цикла. Вы не хотите считать это error.

1 голос
/ 30 сентября 2011

Вы начинаете i с 0. Поэтому первый тест - if(array[0] == array[0]);)

0 голосов
/ 31 декабря 2014

Следующий код в порядке, но он возвращает 11. Не уверен, что это то, что ожидалось.

public static void main(String[] args){
    int[] array = {23, 23, 0, 43, 545, 12, -55, 43, 12, 12, -999, -87, 12, 0, 0};
    int error = 0;
    for(int i=0;i<array.length;i++){
        for(int j=i+1;j<array.length;j++){
            if(array[i] == array[j]){
                if(i!=j){
                    error = error + 1;
                }
            }
        }
    }
    System.out.println(error);
}

Я предлагаю немного сложное, но, надеюсь, более продвинутое решение.

package myjavaprogram;
import java.util.Arrays;

public class TestClass1 {
    public static void main(String[] args){
        int[] array = {23, 23, 0, 43, 545, 12, -55, 43, 12, 12, -999, -87, 12, 0, 0};
        //int[] array = {23, -22, 0, 43, 545, 12, -55, 43, 12, 0, -999, -87, 12};
        //int[] array = {23, -22, 0, 23};
        //int[] array = {23, -22, 23};
        calculate_duplicates(array);        
    }

    private static void calculate_duplicates(int[] array) {
        calculateUniqueNumbers(array);
    }

    private static void calculateUniqueNumbers(int[] array) {
        Pair[] pairs = new Pair[array.length];
        initializePairsAtrray(pairs, array);
        printPairsAtrray(pairs);

        System.out.println("array.length="+array.length);
        System.out.println("--------------------");

        // update pairs array taking in account duplicates duplicates
        for(int i = 0; i < array.length; i++) {
            System.out.println("array[i]="+array[i] + " i="+i);
            for(int j = i+1; j < array.length; j++) {
                System.out.println("array[j]="+array[j]+" j="+j);

                if(array[i] == array[j] && pairs[j].useDuringCount == true) {
                    pairs[i].occurance_num++;

                    pairs[j].occurance_num = 0;
                    pairs[j].useDuringCount = false;
                }

                if(array[i] == 0) {
                    pairs[i].occurance_num = 0;                    
                }
                if(array[j] == 0) {
                    pairs[j].occurance_num = 0;
                    pairs[j].useDuringCount = false;
                }                
            }
            pairs[i].useDuringCount = false;
            System.out.println("--------------------");
        }                
        printPairsAtrray(pairs);

        // calculate general number of duplicates (numbers whick are repeated 
        // in initial array)
        System.out.println("Duplicates in array:"+
                calculateDuplicatesNumber(pairs));        
    }

    private static void initializePairsAtrray(Pair[] pairs, int[] array) {
        for(int i=0;i<pairs.length;i++) {
            Pair p = new Pair();            
            p.occurance_num = 1;
            p.value = array[i];
            p.useDuringCount = true;
            pairs[i] = p;
        }
    }

    private static void printPairsAtrray(Pair[] pairs) {
        System.out.println("--------------------");
        for(int i=0;i<pairs.length;i++) {
            System.out.println("pairs["+i+"].occurance_num="+pairs[i].occurance_num);
            System.out.println("pairs["+i+"].value="+pairs[i].value);
            System.out.println("pairs["+i+"].useDuringCount="+pairs[i].useDuringCount);
            System.out.println("--------------------");
        }
    }

    private static int calculateDuplicatesNumber(Pair[] pairs) {
        System.out.println("-------------------- Duplicates:");
        int duplicates_num = 0;
        for(int i=0;i<pairs.length;i++) {
            if(pairs[i].occurance_num > 1) {
                duplicates_num++;
                System.out.println("number: "+pairs[i].value+" occurance_num " + pairs[i].occurance_num);
            }
        }
        return duplicates_num;
    }        
}    

class Pair {
    int value;
    int occurance_num;
    boolean useDuringCount;
}

Mykola

0 голосов
/ 30 сентября 2011

Если вы собираетесь использовать любую коллекцию, вы можете легко найти дубликаты в массиве

Пример:

 public static void main(String[] args) {
    boolean containsDuplicate =false;
    int[] intArray = new int[] {1,245,324,1,523};
    List<Integer> myObj = new ArrayList<Integer>();
    for(int id : intArray){
        if(myObj.contains(id)){
            containsDuplicate = true;
            System.out.println("Duplicate");
        }else{
            myObj.add(id);
        }
    }

}
0 голосов
/ 30 сентября 2011

Вам также нужно «думать о Java».Используйте Array.equals для сравнения.См. Документацию здесь и некоторые примеры здесь

0 голосов
/ 30 сентября 2011

В вашем коде на

int i=0;
for(i=0;i<size;i++){
    if(array[0]==array[i]){    //this condition runs true only for the first time. as i=0 here
        error=error+1;
    }
    System.out.println(error); //now here you had put the println(error) outside the if()-condition therefore it will be printed repeatedly value of error which is 1
}
0 голосов
/ 30 сентября 2011

Попробуйте дважды вложенный цикл.Как то так

for (int i=0;i<size-1;i++){
  for (int j=i+1; j<size; j++) {
    error += (array[i] == array[j]) ? 1 : 0;
  }
}
0 голосов
/ 30 сентября 2011

Вы всегда получите хотя бы одну ошибку, потому что array[0] == array[i] будет истинным на первой итерации, когда i = 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...