web-dev-qa-db-ja.com

Javaリスト内のすべての決定要素が同じ

リスト内のすべての要素が同じかどうかを確認しようとしています。といった:

(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;
}
25
Colin Zhong

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つの問題:

  • Stringsを比較しているので、_!=_ではなく!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;
_
70
aioobe

リスト内の値の頻度は、リストのサイズと同じになります。

boolean allEqual = Collections.frequency(templist, list.get(0)) == templist.size()

5
darrenp

これはStream.allMatch()メソッドの素晴らしいユースケースです:

boolean allMatch(述語述語)

このストリームのすべての要素が指定された述語と一致するかどうかを返します。

メソッドをジェネリックにすることもできるため、あらゆるタイプのリストで使用できます。

static boolean allElementsTheSame(List<?> templist) {
    return templist.stream().allMatch(e -> e.equals(templist.get(0)));
}
3
Anderson Vieira