如何从数组中获取值而不计算重复项?

时间:2019-05-23 00:17:46

标签: java arrays for-loop

我知道标题确实很糟糕,但是我花了大约10分钟的时间才想出一种以简洁的方式描述我的问题的方法,但是没有。 该程序应该创建一个numUnique()静态方法,该方法返回数组中唯一数字的数量。因此,例如,如果我有一个{2、4、2、7、16、4}数组,则唯一数字将为4(2、4、7和16)。

我正在编写代码以在数组中查找重复项,然后我意识到当我有重复项时我不知道该怎么做,而且我一直在努力思考解决方案但是我不能。

这是到目前为止的代码:

public class Unique {
    public static void main(String[] args) {
        int[] numbers = {1, 6, 2, 14, 6, 8, 2, 1, 23};
        numUnique(numbers);
    }

    public static void numUnique(int[] array){
        Arrays.sort(array);
        for (int i = 0; i < array.length; i++) {
            for (int j = i + 1; j < array.length; j++) {
                if (array[i] == array[j])
                    //code here
            }
        }
    }
}

4 个答案:

答案 0 :(得分:0)

我的理解是您要计算(而不是全部返回)数组中唯一元素的数量。您试图一直向下看,但是足以跟踪重复的次数。这段代码向后看,当前条目是否重复上一个条目(之所以起作用是因为您进行了排序,这是一个很好的步骤)。

import java.util.Arrays;
public class Unique {
public static void main(String[] args) {
    int[] numbers = {
        1,
        6,
        2,
        14,
        6,
        8,
        2,
        1,
        23
    };
    System.out.println(numUnique(numbers));
}

public static int numUnique(int[] array) {
    Arrays.sort(array);
    int dups = 0;
    for (int i = 1; i < array.length; i++) {
        if (array[i] == array[i - 1]) {
            dups++;
        }
    }
    return (array.length - dups);
}
}

答案 1 :(得分:0)

如果您想保留到目前为止的代码并对列表进行排序,则有两个选项似乎很有意义。一种是返回唯一整数的数量,另一种是返回唯一整数的列表。

返回唯一数字的数量:

public static int numUnique(int[] array) {
    ArrayList<Integer> uniques = new ArrayList<>();
    Arrays.sort(array);

    uniques.add(array[0]);

    int prev = array[0];
    for (int i = 1; i < array.length; i++) {
        if(array[i] != prev){
            uniques.add(array[i]);
            prev = array[i]
        }
    }
    return uniques.size();
}

返回唯一数字列表,只需要返回不带.size()的唯一列表即可。

如果要使用数组而不是列表,则需要返回以下内容:

return uniques.toArray(new Integer[list.size()]);

答案 2 :(得分:0)

如果您使用的是数组,为什么不做进一步的探索

private static long numUnique(int[] numbers) {
    return Arrays.stream(numbers).distinct().count();
}

答案 3 :(得分:0)

按原样保留代码:

如果您想知道数组中有多少个非重复

public static void numUnique(int[] array) {
        Arrays.sort(array);
// Here, make a variable that keeps size of an array
        int arrayLenght = array.length;
// Here is our counter:
        int duplicates = 0;

        for (int i = 0; i < array.length; i++) {
            for (int j = i + 1; j < array.length; j++) {
                if (array[i] == array[j])
                    // when you find duplicate, add 1 to our counter:
                    duplicates++;

            }
        }
        //at the end you can count how many non-duplicates are in the array:
        arrayLenght -= duplicates;
        System.out.println("There are " + arrayLenght + " non duplicates in our array.");
    }

修改 此解决方案并非在每种情况下都适用。

我知道这不是执行此操作的最佳方法,而是我唯一知道的方法:

public static void numUnique(int[] array) {
        Arrays.sort(array);

        int arrayLenght = array.length;
        int duplicates = 0;

        for (int i = 0; i < array.length; i++) {
//a little change in our second for-loop:
            for (int j = 0; j < array.length; j++) {
                if (array[i] == array[j]) { 
//Here i'm just summing up the duplicates
                duplicates ++;
                }

            }
// Aaand here, on a console, i print the value (array[i]) and how many duplicates does it have.

//to be exact, if the duplcicates rise only once so it's equal to 1, it means that there is no duplicate of this value (it found itself in the loop).

            if (duplicates == 1) {
                duplicates = 0;
            }

            System.out.println(array[i] + " have " + duplicates + "duplicates");

// And what is imporatnt We have to reset our duplication-container!
// so in further loops it will count duplicates for each value in array

            duplicates = 0;

        }

    }

如果您发现其他问题,请立即问我