Java 8で記述したい既存のコードがJavaにあります。
誰かがこのコードをJava 8に移植する提案を提供できますか?
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList();
Map<String, List<String>> map = new HashMap();
if (strs == null || strs.length == 0) return result;
for (String word: strs) {
char[] wordArr = word.toCharArray();
Arrays.sort(wordArr);
String sortedWord = new String(wordArr);
if (map.containsKey(sortedWord)) {
List<String> list = map.get(sortedWord);
list.add(word);
map.put(sortedWord, list);
} else {
List<String> list = new ArrayList();
list.add(word);
map.put(sortedWord, list);
}
}
return new ArrayList(map.values());
}
}
更新 -getOrDefault()を使用しました
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> result = new ArrayList();
Map<String, List<String>> map = new HashMap();
if (strs == null || strs.length == 0) return result;
for (String word: strs) {
char[] wordArr = word.toCharArray();
Arrays.sort(wordArr);
String sortedWord = new String(wordArr);
List<String> list = map.getOrDefault(sortedWord, new ArrayList());
list.add(word);
map.put(sortedWord, list);
}
return new ArrayList(map.values());
}
}
その他の方法で ?
ストリームを使用して思いつくことができる最高のソリューションは次のとおりです。
public class Solution {
private static String sortString(String str) {
char[] chars = str.toCharArray();
Arrays.sort(chars);
return new String(chars);
}
public List<List<String>> groupAnagrams(String[] strs) {
if (strs == null) {
return new ArrayList<>();
}
return new ArrayList<>(Arrays.stream(strs)
.collect(Collectors.groupingBy(Solution::sortString))
.values());
}
}
単純なものから始めstrs
て、ユーティリティメソッドを使用して配列からストリームを作成しますArrays.stream(array)
。
Arrays.stream(strs);
Stream#collect(collector)
この方法は、ストリームを受け取り、標準のコレクション型(に変換するMap
、List
など)。
Arrays.stream(strs)
.collect(...);
この例では、を使用しますCollectors.groupingBy(classifier)
。このコレクターは、classifier
ラムダ関数に各値を渡した結果によって指定されたビンラベルを使用して、ストリームを「ビン」にソートします。戻り値の型はMap<K, List<V>>
(K
ラベルの型であり、V
ストリーミングしている型です)- map
変数に使用したのと同じ形状です。
Arrays.stream(strs)
.collect(Collectors.groupingBy(...));
しかし、どの関数を渡し.groupingBy()
ますか?ソートされた文字列でグループ化しようとしているので、通常の文字列からソートされた文字列を作成する関数が必要です。これには既存の関数を使用します。
Arrays.stream(strs)
.collect(Collectors.groupingBy(str -> {
char[] chars = word.toCharArray();
Arrays.sort(chars);
return new String(chars);
}));
けれどもStreamyにあることの興味では、我々はしてその機能を置き換える別の *ストリーム:(それは結局のところchar
sがきれいにストリーミングされません)
わかりやすくするために、ラムダ関数をクラスの静的メソッドにリファクタリングしました。
private static String sortString(String str) {
char[] chars = str.toCharArray();
Arrays.sort(chars);
return new String(chars);
}
Arrays.stream(strs)
.collect(Collectors.groupingBy(str -> {
return Solution.sortString(str);
}));
パラメーターを1つだけ取る関数を1回呼び出しているので、ラムダ関数の代わりにメソッド参照を使用できます。
Arrays.stream(strs)
.collect(Collectors.groupingBy(Solution::sortString));
残りは既存のコードと非常によく似ています。を使用Map#values()
してデータセットからキーを取り除き、結果Collection
をラップしてArrayList
:
new ArrayList<>(Arrays.stream(strs)
.collect(Collectors.groupingBy(Solution::sortString))
.values());
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加