2016-12-12 15 views
1

2つのリスト(どちらもタイプPerson)を受け取る方法があります。 Personクラスには多数の属性がありますが、名前と年齢属性のみに基づいて同じ項目がリストに含まれているかどうかをチェックし、等しい場合はtrueを返し、そうでない場合はfalseを返します。あなたのメンバーの値に応じて、真/偽person1.equals(person2)戻りますが、そのようJavaの2つの別々のリストの項目を比較する

は、私はこの?:

public boolean compareTwoLists(List<Person> list1, List<Person> list2) 
{ 
    for (Person person1 : list1) 
    { 
     for (Person person2 : list2) 
     { 
      if (person1.getAge().equals(person2.getAge() && person1.getName().equals(person2.getName()))) 
      { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

答えて

0

を行うことができる任意のよりよい方法は、あなたのPersonクラスでオーバーライドObject.equals()あります。

+0

これは唯一の方法は、 '.equals()'メソッドがオーバーライドされている場合です。それ以外の場合は、オブジェクト参照をチェックします。 – CraigR8806

+0

メンバーのすべてが同等でない場合はどうなりますか? – ct2602

+0

私は間違っている、それを指摘してくれてありがとう。更新された答え。 – SporreKing

0

チェックアウトthis答え。

Comparableを実装する必要があります。 は(単純化のために)はnullではありませんすべてのフィールドを想定すると、その年齢はint型で、かつ ランキング比較すると、まず、年齢、compareToメソッドは非常に簡単です、最後のものである:

public int compareTo(Person other) { 
    int i = firstName.compareTo(other.firstName); 
    if (i != 0) return i; 

    i = lastName.compareTo(other.lastName); 
    if (i != 0) return i; 

    return Integer.compare(age, other.age); 
} 

あなたは可能性もあなたのそれはあなたが二つのリストを比較したい場合は、あなたが両方を反復処理する必要があります。この

public boolean equals(Object p) { 
    ... // More code here - null checks 
    if(p.getName().equals(this.name) && p.getAge() == this.age) 
     return true; 
    else 
     return false; 
} 
0

のように年齢と名前をチェックするためにequalsメソッド@Overrideが、あなたのリストはをソートされ、あなただけしたい場合彼らが平等であるかどうかを知るためにあなたはそれを作るされ、Comparatorとしてあなたの方法を書くことができ、さらに

public boolean compareTwoLists(List<Person> list1, List<Person> list2) { 

    // Lists don't have the same size, objects missing in 
    // list one or two. I your lists have the same size, skip this. 
    if (list1.size() != list2.size() { 
     return false; 
    } 

    Iterator<Person> it1= list1.iterator(); 
    Iterator<Person> it2= list2.iterator(); 

    while (it1.hasNext()) { 
     Person person1 = it1.next(); 
     Person person2 = it2.next(); 

     // Age or name do not match, objects differ, lists are not equal. 
     if ((!person1.next().getAge().equals(person2.getAge()) || (!person1.getName().equals(person2.getName())))) 
      return false; 
    } 

    // All items are the same. 
    return true; 

} 

:アルかどうかは、その後、あなただけの大規模なリストのためにはるかに速い終わりである必要があり、一度両方のリストの各リスト要素を、確認する必要がありより多くの再利用可能か、0(リストが等しい)を返すことができますので、並べ替えに適した、-1(最初のリストが小さい)、1(最初のリストが大きい)、またはあなたの目的のために他の意味:

class PersonListComparator implements Comparator<List<Person>> { 
    @Override public int compare(List<Person> list1, List<Person> list2) { 
     // Your code 
    } 
} 

あなた可能性ものequals(...)メソッドをオーバーライドすることを検討してくださいクラス、の場合は常にの名前と年齢を比較してください。その後、コード内で比較をperson1.equals(person2)に短縮することができました。

Comparableインターフェイスを使用すると、int compareTo(T object)というメソッドがComparatorと同じクラスに追加されます。

+0

両方のリストの等価性をチェックすることを目的としている場合は、ソートでより速い選択肢を追加しました。 – thatguy

0

あなたは2人の年齢と名前が同じになるとすぐに真を返しますが、それはすべての人にとって真実であるとは限りません。

これを達成するには、比較が失敗するとすぐにfalseを返す必要があります。
ループが終了すると、falseが返されなかった場合、すべての要素の年齢と名前の値が同じであることが示されます。ですから、trueを返す:

public boolean compareTwoLists(List<Person> list1, List<Person> list2){ 
    for (Person person1 : list1) { 
    for (Person person2 : list2) { 
     if (!person1.getAge().equals(person2.getAge() || !person1.getName().equals(person2.getName()))) { 
     return false; 
     } 
    } 
    } 
    return true; 
} 
1

以下のどちらのソリューションを使用すると、Personクラスと混乱しないので、私は最初のものを好むのJava 8です。しかし、あなたが何かを壊さないことを絶対に確信しているならば、、2番目の解決策は読者の方がはっきりしています。

ソリューション1

public boolean compareTwoLists(List<Person> list1, List<Person> list2) { 

    return list2.stream().anyMatch(l2 -> list1.stream().anyMatch(l1 -> 
     l1.getName().equals(l2.getName()) && 
     l1.getAge().equals(l2.getAge()) 
    )); 
} 

ソリューション2

public boolean compareTwoLists(List<Person> list1, List<Person> list2) { 
    return list2.stream().anyMatch(list1::contains); 
} 

これは、Personオブジェクトの内側に、独自のequalsとhashCodeを実装する必要があることを意味します。

私はあなただけ与えられた2つのリストは、同じデータが含まれているかどうか(人と同じデータの同じ番号)を確認したいと思うあなたの質問から
@Override 
    public boolean equals(Object o) 
    { 
     if (this == o) 
      return true; 
     if (o == null || getClass() != o.getClass()) 
      return false; 

     Person person = (Person) o; 

     if (age != null ? !age.equals(person.age) : person.age != null) 
      return false; 
     return name != null ? name.equals(person.name) : person.name == null; 
    } 

    @Override 
    public int hashCode() 
    { 
     int result = age != null ? age.hashCode() : 0; 
     result = 31 * result + (name != null ? name.hashCode() : 0); 
     return result; 
    } 
0

オーバーライドハッシュコードと名前のみと年齢を確認するためにPersonクラスにメソッドに等しいです。

public class Person { 

private String name; 
private int age; 

// other fields 
private String address; 

public String getName() { 
    return name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public int getAge() { 
    return age; 
} 

public void setAge(int age) { 
    this.age = age; 
} 

public String getAddress() { 
    return address; 
} 

public void setAddress(String address) { 
    this.address = address; 
} 

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + age; 
    result = prime * result + ((name == null) ? 0 : name.hashCode()); 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Person other = (Person) obj; 
    if (age != other.age) 
     return false; 
    if (name == null) { 
     if (other.name != null) 
      return false; 
    } else if (!name.equals(other.name)) 
     return false; 
    return true; 
}} 

そしてちょうど与えられた関数に2つのリストを渡します。

public boolean isListEqual(List<Person> list1, List<Person> list2) { 
    if (list1.size() != list2.size()) { 
     return false; 
    } else { 
     for (Person p : list1) { 
      if (!list2.contains(p)) { 
       return false; 
      } 
     } 
     return true; 
    } 
} 
  • 両方が最初のリストから、すべての人がどうあるべき他の
  • 偽同じ長さの他にリターンである場合には、チェック2番目のリストに存在しない場合はfalseを返します。
関連する問題