0

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

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,因为 Person 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;
}

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

4

3 回答 3

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 对象的equalsandhashCode方法。

于 2013-02-25T04:04:13.750 回答
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);

你怎么期待计数????

于 2013-02-25T04:34:27.957 回答
0
  1. 您的第二个for应该从j+1或者您将比较同一对元素两次,例如一次 whenj=0i=1,第二次 whenj=1i=0

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

  3. 改变

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

    array[i].getAge()==array[j].getAge()
    

    因为您想将第一次迭代的元素与第二次迭代的元素进行比较,而不是“邻居”元素。

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

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

于 2013-02-25T04:08:43.353 回答