在数组中搜索重复项

时间:2013-02-25 04:01:30

标签: java arrays comparison

如果我用这个数据初始化一个人物对象数组

myPeople[0] = new Person("Alice", "Foo", 22 );
myPeople[1] = new Person("Alice", "Foo", 22 );
myPeople[2] = new Person("Bob", "Bar", 2);
myPeople[3] = new Person("Joe", "Blogs", 64);
myPeople[4] = new Person("Jane", "Joe", 42);

我希望我的方法返回重复数量。在这种情况下,它将是2,因为人0和1是彼此的共同体。如果我要将对象2更改为相同它应该返回3.此时我的方法返回1,两个重复,4个,三个。

有问题的方法:

public static int searchForClones(Person[] array){
    int numberOfClones=0;
    for(int j =0; j<array.length-1; j++)
    {
        String tmp1 = array[j].getFirstName();          //Store first element of the array in tmp so it can be compared
        String tmp3 = array[j].getLastName();   
        for(int i = 0; i<array.length-1; i++)           //Loop to compare for every element in the array
        {   
            String tmp2 = array[i].getFirstName();      //Do the same for the next element
            String tmp4 = array[i].getLastName();
            if(i!=j)                                    //If i an j aren't the same element
            {

                if(tmp1.equals(tmp2) && tmp3.equals(tmp4)   //and if they match
                    && array[i].getAge()==array[i+1].getAge())
                {   
                    numberOfClones++;                   //increment the number of clones
                }
           }
       }
    }
    return numberOfClones;
}

我真的很感激任何帮助,因为我认为唯一的问题是我增加克隆数量的方式。也许我需要检查一下并在那之后用适当的数字增加?

3 个答案:

答案 0 :(得分:3)

有一种方式:

public static int searchForClones(Person[] array){
    if(array == null || array.length == 0) return 0;

    return array.length - new HashSet(Arrays.asList(array)).size();
}

与往常一样,请确保实现正确实现Person对象的equalshashCode方法。

答案 1 :(得分:0)

  1. 您的第二个for应该从j+1开始,或者您将比较同一对元素两次,例如j=0i=1,第二次{ {1}}和j=1

  2. 将第二个for循环的条件更改为i=0,否则您将跳过最后一个元素

  3. 更改

    i<array.length

    array[i].getAge()==array[i+1].getAge()
    

    因为你想比较第一次迭代的元素和第二次迭代的元素,而不是“邻居”元素。

  4. 另请记住,此方法将返回相同元素对的数量,而不是相同元素的数量。

    要计算相同元素的数量,您可能应该先对数组进行排序,使相同的元素彼此靠近,然后遍历该数组,并且每对第X对元素增加2,因为有两个相同的元素),对于每一对X元素,将计数器增加1(现在只有一个新元素)。

答案 2 :(得分:0)

public static int searchForClones(Person[] array)
{
    int numberOfClones = 0;
    for(int i=0; i<array.length-1; i++)
    {
        for(int j=i+1; j<array.length; j++)
        {
            if(array[i].getFirstName().equals(array[j].getFirstName())
                && array[i].getLastName().equals(array[j].getLastName())
                && array[i].getAge() == array[j].getAge()) )
            {
                numberOfClones++;
            }
        }
    }

    return numberOfClones > 0 ? ++numberOfClones : 0;  // To count the one which was duplicate of itself (as per your comment)
}

用上述程序
输入:

myPeople[0] = new Person("Alice", "Foo", 22 );
myPeople[1] = new Person("Alice", "Foo", 22 );
myPeople[2] = new Person("Bob", "Bar", 2);
myPeople[3] = new Person("Joe", "Blogs", 64);
myPeople[4] = new Person("Jane", "Joe", 42);

输出: 2

但如果输入是:

myPeople[0] = new Person("Alice", "Foo", 22 );
myPeople[1] = new Person("Alice", "Foo", 22 );
myPeople[2] = new Person("Bob", "Bar", 2);
myPeople[3] = new Person("Joe", "Blogs", 64);
myPeople[3] = new Person("Joe", "Blogs", 64);

你怎么看待伯爵?