は[1a,1b,2a,2b,3a,3b, etc.]
の形式で格納されており、シャッフルして#a
と#b
が一緒になるようにしたいと思います。私は#a
と#b
の両方を保持しているオブジェクトを作って、それらのオブジェクトのうちのLinkedList
をシャッフルすることができることを知っていますが、もっと便利な方法があるのだろうかと思っていました。構造体を維持しながらリンクされたリストをシャッフルする
ありがとうございました!
は[1a,1b,2a,2b,3a,3b, etc.]
の形式で格納されており、シャッフルして#a
と#b
が一緒になるようにしたいと思います。私は#a
と#b
の両方を保持しているオブジェクトを作って、それらのオブジェクトのうちのLinkedList
をシャッフルすることができることを知っていますが、もっと便利な方法があるのだろうかと思っていました。構造体を維持しながらリンクされたリストをシャッフルする
ありがとうございました!
Java 8ストリームを使用するのが最も便利な方法です。
例コードは、shuffle()
の効果を確認するために10回実行されます。
List<String> input = Arrays.asList("1a","1b","2a","2b","3a","3b");
for (int i = 0; i < 10; i++) {
List<List<String>> tmp = new ArrayList<>(input.stream()
.collect(Collectors.groupingBy(s -> s.substring(0,1)))
.values());
Collections.shuffle(tmp);
LinkedList<String> output = tmp.stream()
.flatMap(List::stream)
.collect(Collectors.toCollection(LinkedList::new));
System.out.println("\t" + output);
}
出力
[1a, 1b, 2a, 2b, 3a, 3b]
[2a, 2b, 3a, 3b, 1a, 1b]
[3a, 3b, 1a, 1b, 2a, 2b]
[1a, 1b, 2a, 2b, 3a, 3b]
[3a, 3b, 1a, 1b, 2a, 2b]
[1a, 1b, 2a, 2b, 3a, 3b]
[2a, 2b, 3a, 3b, 1a, 1b]
[3a, 3b, 2a, 2b, 1a, 1b]
[1a, 1b, 2a, 2b, 3a, 3b]
[1a, 1b, 3a, 3b, 2a, 2b]
はい、あります。単語 "シャッフル"を使用して、実際にエントリ#aと#bを並べ替えることができます。私の前提が正しければ、java.util.Collections.sort()
を使用して達成することができます。これにより、カスタマイズされたComparator実装クラスをソート関数に渡すことができます。 これを実現する方法の例を以下に示します。
class LinkedListSort{
public static void main(String[] args)
{
LinkedList<String> list = new LinkedList<String>();
String linkedListDataString = "1a,1b,2a,2b,3a,3b";
for(String str : linkedListDataString.split(",")) {
list.add(str);
}
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String object1, String object2) {
String suffix1 = object1.substring(object1.length()-1);
String suffix2 = object2.substring(object2.length()-1);
return Collator.getInstance().compare(suffix1,suffix2);
}
});
System.out.println("Sorted list entries: ");
for(String e:list) {
System.out.println(e);
}
}
}
手作業でもっと不便な方法があります。 – Kayaman
あなたの質問には、具体的にどのような期待結果が具体的に追加してください。 –
いいえ、あなたが提案したものが最も便利な方法です。 ['Collections.shuffle()'](https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#shuffle-java.util.List-)を使用する場合は、 (*最も便利な方法では) '1a'と' 1b'を一緒に保ちたいとしたら、値を一緒に保持し、それらのオブジェクトをシャッフルする必要があります。 – Andreas