-2

Employee と Person という 2 つのオブジェクトがあります。どちらにも firstName と lastName があります。Person と Employee の firstName,lastName が既にリストに追加されている場合、オブジェクト (Employee または Person) をリストに追加したくありません。

これを行うには、equals と hashcode を使用します...

編集: Set やその他のコレクションを使用することはできません。これを実現するには、 equals と hashcode を使用する必要があります。

4

6 に答える 6

1

equals/hashcode の例については、この質問をご覧ください。リストへの追加に関しては、次の 2 つのオプションがあります。

  1. 要素を追加する前に、毎回List.contains メソッドを使用して List にオブジェクトが含まれているかどうかを確認します
  2. 追加された要素の順序を保存してから返す LinkedHashSetを使用しますnew ArrayList<Employee>(employeeLinkedHashSet);
于 2012-12-19T14:21:41.157 に答える
0

EmployeeとのIDを結合したいので、Person準備ができている場合を除いて、これを簡単に達成することはできません。

  1. 持っているEmployee extends Person
  2. それ以上のプロパティに関係なく、sEmployeesと等しくなるとすぐにすべてが等しくなります。Person

これらの制約が許容できる場合は、を実装Person#equalsPerson#hashCodeて関与さfirstNameせ、lastNameを使用しSetて重複を排除します。

于 2012-12-19T14:15:28.277 に答える
0

を使用して、重複を回避します。JavaAPIドキュメントで詳細を読む

于 2012-12-19T14:15:52.393 に答える
0
  1. 次のような既存の実装をListラップする実装ListArrayList
  2. すべてのメソッド呼び出しをラップされたリストに委任します
  3. を実装addaddAllて、値がすでにリストにある場合に値が追加されないようにします。

ユーザーは、を呼び出すと実際にオブジェクトがコレクションに追加される(サイズが1つ増える)ことを期待しているため、この実装はListインターフェイスと矛盾することに注意してください。add

追加する前にSet、実装を使用するか(重複を回避しますが、挿入順序は保持しません)、重複をチェックする方がはるかに優れています。

 List<Person> persons = getPersonsFromSomewhere();
 Person person = getAPersonThatShallBeAddedIfNotDuplicate();
 if (!persons.contains(person)) {
    persons.add(person);
 }
于 2012-12-19T14:16:04.887 に答える
0

リストではなく、を使用してくださいSet。リストが必要な場合は、それを呼び出してコンストラクターSet.toArray()に渡すことができます。List

EmployeeクラスとPersonクラスにを実装してもらいますかComparable<T>。EmployeeをPersonのサブクラスにすると、これが簡単になる場合があります。

于 2012-12-19T14:17:02.637 に答える
0

一意である必要があるフィールドがいくつかある場合は、マップを使用する必要があると思います。複合キーであるカスタム クラスを使用するか、区切り記号を使用して文字列を 1 つの文字列に結合できます。

Map<String, Employee> employeeMap = ....

String fullname = employee.firstName + "~" + employee.lastName;
Employee employee = employeeMap.get(fullname);
if (employee == null) {
   // not in the map so add it.
   employeeMap.put(fullname, employee);
} else {
   // employee is already in the collection.
   // alter it or produce a warning
}

注: String には既にメソッドequalshashCodeメソッドがあるため、それらを追加する必要はありません。

于 2012-12-19T14:18:37.090 に答える