数组中唯一元素的数量

时间:2016-12-28 22:36:50

标签: java arrays loops

这是作业

我只想知道错误是什么。 我试图将数组的每个元素相互比较并返回唯一元素的数量。我一个人得错了? 有人可以帮我找出错误是什么吗?

public static int numUnique (double[] list) {
    int index = 1;
    int result = 0;
    if(list.length == 0){return 0;}

    while(index < list.length) {
        if(list[index] != list[index - 1]) {
            result = result + 1;
        }
        index++;
    }
    return result;
}

输出:

Failed numUnique([11]): Expecting (1) Actual (0)

Failed numUnique([11 11 11 11]): Expecting (1) Actual (0)

Failed numUnique([11 21 31 41]): Expecting (4) Actual (3)

Failed numUnique([11 11 11 21 31 31 31 31 41]): Expecting (4) Actual (3)

Failed numUnique([11 21 21 21 31 41 41 41 41]): Expecting (4) Actual (3)

Failed numUnique([11 11 21 21 21 31 31 41 41 41 41]): Expecting (4) Actual (3)

5 个答案:

答案 0 :(得分:1)

通过将index的初始值设置为1,您的循环将跳过0元素,因为您可以保证它是唯一的(因为您还没有查看任何元素)。既然如此,您也应该将result初始化为1。

答案 1 :(得分:1)

逻辑存在缺陷,您只是将每个元素与之前的元素进行比较,并计算它们之间的差异。

它似乎适用于您的示例,因为所有重复项都是彼此相邻的,但您的描述并未指定始终如此。

您希望将每个元素与之前的所有其他元素进行比较,并计算它们的唯一性:

int uniques = 0;
for(int i = 0 ; i < list.length ; i++) {
    boolean found = false;
    for(int j = 0 ; j < i ; j++) {
        if(list[i] == list[j]) {
            found = true;
            break;
        }
    }
    uniques += found ? 0 : 1;
}

答案 2 :(得分:0)

试试这个:

<强> CODE:

public class uniqueElements {
    public static void main(String args[]){
        double[] list = new double[8];
        list[0] = 1.1;
        list[1] = 2.4;
        list[2] = 3.5;
        list[3] = 1.1;
        list[4] = 2.4;
        list[5] = 2.4;
        list[6] = 3.3;
        list[7] = 3.5;
        System.out.println(numUnique(list));
    }

    public static int numUnique (double[] list) {
        int numUniqueCounter = 0;
        A: 
            for(int i=0;i<list.length;i++){
                double currentNumber = list[i];         
                for(int j=i+1;j<list.length;j++){
                    if(list[j] == currentNumber){                               
                        continue A;                     
                    }
                }               
                numUniqueCounter++;
            }
        return numUniqueCounter;
    }
}

<强>输出:

4

答案 3 :(得分:0)

使用此功能,高效且单次传递可以确定独特的元素

public static int numUnique(double[] list) {
        Set<Double> uniqueSet = new HashSet<>();
        for (int i = 0; i < list.length; i++) {
            uniqueSet.add(list[i]);
        }
        return uniqueSet.size();
    }

答案 4 :(得分:0)

我无法抗拒:

   public static int numUnique (Double[] list) {
    return new HashSet<>(Arrays.asList(list)).size();
   }

不是从double []到Double []的更改。

您应尽量避免手动循环。正如你所发现的那样,循环是错误的。学习使用这些系列。