随机播放对象列表 java 流
Shuffle the list of Objects java stream
我有一个单词列表:List<Word> words
bean Word
是:
public class Word {
private String name;
private String meaning;
...
}
我想将元素打乱,使其具有以下内容:
发件人:
{ name: "day", meaning: "giorno"},
{ name: "year", meaning: "anno"},
{ name: "hour", meaning: "ora"}
收件人:
{ name: "day", meaning: "ora"},
{ name: "year", meaning: "giorno"},
{ name: "hour", meaning: "anno"}
我已经试过了,但我认为有一个更优雅的解决方案:
private List<Word> shuffle(List<Word> words) {
List<String> names = words.stream()
.map(word -> word.getName())
.collect(Collectors.toList());
List<String> meanings = words.stream()
.map(word -> word.getMeaning())
.collect(Collectors.toList());
Collections.shuffle(meanings);
words = new ArrayList<Word>();
for(int i = 0; i<names.size(); i++) {
words.add(new Word(names.get(i), meanings.get(i)));
}
return words;
}
您可以就地洗牌。为此,您不需要创建额外的 Word
对象。
private void shuffle(List<Word> words) {
List<String> meanings = words.stream()
.map(Word::getMeaning)
.collect(Collectors.toList());
Collections.shuffle(meanings);
for(int i = 0; i < words.size(); i++) {
words.get(i).setMeaning(meanings.get(i));
}
}
没有 zip
并且只有就地洗牌,您的解决方案看起来非常优雅。我只是稍微重构一下:
ArrayList<Word> wordsCopy = new ArrayList<>(this.words);
Collections.shuffle(wordsCopy);
List<Word> result = IntStream.range(0, words.size())
.mapToObj(i -> new Word(words.get(i).name, wordsCopy.get(i).meaning))
.collect(Collectors.toList());
我有一个单词列表:List<Word> words
bean Word
是:
public class Word {
private String name;
private String meaning;
...
}
我想将元素打乱,使其具有以下内容:
发件人:
{ name: "day", meaning: "giorno"},
{ name: "year", meaning: "anno"},
{ name: "hour", meaning: "ora"}
收件人:
{ name: "day", meaning: "ora"},
{ name: "year", meaning: "giorno"},
{ name: "hour", meaning: "anno"}
我已经试过了,但我认为有一个更优雅的解决方案:
private List<Word> shuffle(List<Word> words) {
List<String> names = words.stream()
.map(word -> word.getName())
.collect(Collectors.toList());
List<String> meanings = words.stream()
.map(word -> word.getMeaning())
.collect(Collectors.toList());
Collections.shuffle(meanings);
words = new ArrayList<Word>();
for(int i = 0; i<names.size(); i++) {
words.add(new Word(names.get(i), meanings.get(i)));
}
return words;
}
您可以就地洗牌。为此,您不需要创建额外的 Word
对象。
private void shuffle(List<Word> words) {
List<String> meanings = words.stream()
.map(Word::getMeaning)
.collect(Collectors.toList());
Collections.shuffle(meanings);
for(int i = 0; i < words.size(); i++) {
words.get(i).setMeaning(meanings.get(i));
}
}
没有 zip
并且只有就地洗牌,您的解决方案看起来非常优雅。我只是稍微重构一下:
ArrayList<Word> wordsCopy = new ArrayList<>(this.words);
Collections.shuffle(wordsCopy);
List<Word> result = IntStream.range(0, words.size())
.mapToObj(i -> new Word(words.get(i).name, wordsCopy.get(i).meaning))
.collect(Collectors.toList());