リスト内のすべての要素が同じかどうかを確認しようとしています。といった:
(10,10,10,10,10) --> true
(10,10,20,30,30) --> false
ハッシュセットが役立つかもしれないことは知っていますが、Javaでの記述方法はわかりません。
これは私が試したものですが、うまくいきませんでした:
public static boolean allElementsTheSame(List<String> templist)
{
boolean flag = true;
String first = templist.get(0);
for (int i = 1; i< templist.size() && flag; i++)
{
if(templist.get(i) != first) flag = false;
}
return true;
}
Stream API(Java 8+)を使用
_boolean allEqual = list.stream().distinct().limit(2).count() <= 1
_
または
_boolean allEqual = list.isEmpty() || list.stream().allMatch(list.get(0)::equals);
_
Set
:を使用
_boolean allEqual = new HashSet<String>(tempList).size() <= 1;
_
ループを使用:
_boolean allEqual = true;
for (String s : list) {
if(!s.equals(list.get(0)))
allEqual = false;
}
_
OPのコードの問題
コードに関する2つの問題:
String
sを比較しているので、_!=
_ではなく!templist.get(i).equals(first)
を使用する必要があります。
_return true;
_があるはずなのに_return flag;
_があります
それとは別に、あなたのアルゴリズムは健全ですが、flag
なしで逃げることができます:
_String first = templist.get(0);
for (int i = 1; i < templist.size(); i++) {
if(!templist.get(i).equals(first))
return false;
}
return true;
_
あるいは
_String first = templist.get(0);
for (String s : templist) {
if(!s.equals(first))
return false;
}
return true;
_
リスト内の値の頻度は、リストのサイズと同じになります。
boolean allEqual = Collections.frequency(templist, list.get(0)) == templist.size()
これはStream.allMatch()
メソッドの素晴らしいユースケースです:
boolean allMatch(述語述語)
このストリームのすべての要素が指定された述語と一致するかどうかを返します。
メソッドをジェネリックにすることもできるため、あらゆるタイプのリストで使用できます。
static boolean allElementsTheSame(List<?> templist) {
return templist.stream().allMatch(e -> e.equals(templist.get(0)));
}