ハッシュセットを使用せずに ArrayList にある異なるアイテムの数を数える Java のメソッドがあるかどうかを知りたいですか?
ハッシュセットを使用せずに、ArrayList にある DIFFERENT アイテムの数をカウントするために作成する方法がない場合はどうすればよいですか?
ありがとうございました
new HashSet<NestedItem>(theList).size()
Set
重複したネストされたアイテムは自動的に削除されるため、ニーズに合うはずです。
一般的な方法で:
public static <E> int uniqueCount(final List<E> list) {
return new HashSet<E>(list).size();
}
ネストされたタイプのequals/hashCodeメソッドを必要な方法で実装してください。
セットは通常、固有のアイテムを含むコレクションを作成するために使用されます。このプロパティは次のように使用できます。
List<String> myArrayList = new ArrayList<>();
Set<String> temporarySet = new HashSet<>();
temporarySet.addAll(myArrayList);
int uniqueCount = temporarySet.size();
すべてのリストアイテムがComparableを実装している場合は、事前にリストを並べ替えてから、等しくない連続するアイテムをカウントできます。
private static int getUniqueCountUsingSort(List<String> list) {
if (list.size() < 2) { // obvious case.
return list.size();
}
List<String> listCopy = new ArrayList<>(list);
Collections.sort(listCopy);
int uniqueCount = 1;
for (int i = 1; i < listCopy.size(); i++) { // starts at 1.
// Compare with previous item in the sorted list.
if (!listCopy.get(i).equals(listCopy.get(i-1))) {
uniqueCount ++;
}
}
return uniqueCount;
}
このメソッドは、Collections.sort()がO(n log(n))であるため、Setメソッドと同じパフォーマンス特性を備えています。
簡単に難しい方法で行うこともできますが、速度は遅くなりますO(n ^ 2):
private static int getUniqueCountByHand(List<String> list) {
int uniqueCount = 0;
for (int i = 0; i < list.size(); i++) {
boolean isUnique = true;
// look if there is another entity before that is equal to this one.
for (int j = 0; j < i; j++) {
if (list.get(j).equals(list.get(i))) {
isUnique = false;
}
}
if (isUnique) {
uniqueCount ++;
}
}
return uniqueCount;
}
Set
そのサイズを確認します。new HashSet(myListOfItems).size(); // => number of unique elements
listは、オブジェクトのリスト(ArrayList)です。一意のオブジェクトをカウントするには:
Set set = new HashSet(list);
int cnt = set.size();
変数cntには、一意の要素の数が含まれるようになりました。
さらに短い:
int cnt = new HashSet(list).size();
セットにはユニークなアイテムのみが含まれています。
別のアイテムが必要ない場合は、HashSetの使用を検討してください。それ以外に、まだ含まれていない場合は、スイープして別のリストに追加するだけです。ただし、これを行うには約O(n + n / 2)の時間がかかります。