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);

メソッドに重複の数を返したいです。この場合、Person 0 と 1 は互いに重複しているため、2 になります。オブジェクト 2 を同じになるように変更すると、3 が返されます。現時点では、メソッドは 2 つの重複で 1 を返し、3 つの重複で 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

1つの方法は次のとおりです。

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

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

いつものように、Person オブジェクトのequalsandメソッドを適切に実装するように実装してください。hashCode

于 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. 2 番目forは から開始する必要があります。または、同じ要素のペアを2j+1回比較j=0します。i=1j=1i=0

  2. 2 番目の for ループの条件を に変更するi<array.lengthか、最後の要素をスキップします

  3. 変化する

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

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

    「隣接」要素ではなく、最初の反復の要素を2番目の反復の要素と比較したいからです。

また、このメソッドは、同一要素の数ではなく、同一要素のペアの数を返すことに注意してください。

同一の要素の数をカウントするには、おそらく配列をソートして、同一の要素が互いに近くなるようにし、その配列を反復処理して、X 要素の最初のペアごとにカウンターを 2 ずつ増やします (2 つの同一の要素があるため)。 X 要素の次のペアごとにカウンターが 1 ずつ増加します (現在、新しい要素は 1 つだけです)。

于 2013-02-25T04:08:43.353 に答える