我想了解一個編程問題,例如,我給了一個單詞列表(蘋果,橙色,汽車,可以,模糊)我會得到一個散列表與關鍵字的長度以及用於值的單詞的鏈接列表。例如,給定一個字符串列表,創建一個長度和字符串的散列表
(3, {car, can})
(5, {apple, fuzzy})
(6, {orange})
我該如何構建它?我對Java比較陌生,只知道如何讀取字符串輸入並獲取每個字符串的長度。但很不熟悉hashmaps。有人能指引我朝着正確的方向嗎?
我想了解一個編程問題,例如,我給了一個單詞列表(蘋果,橙色,汽車,可以,模糊)我會得到一個散列表與關鍵字的長度以及用於值的單詞的鏈接列表。例如,給定一個字符串列表,創建一個長度和字符串的散列表
(3, {car, can})
(5, {apple, fuzzy})
(6, {orange})
我該如何構建它?我對Java比較陌生,只知道如何讀取字符串輸入並獲取每個字符串的長度。但很不熟悉hashmaps。有人能指引我朝着正確的方向嗎?
這是一個相當簡潔的Java 7的方法:
List<String> words = Arrays.asList("apple", "orange", "car", "can", "fuzzy");
Map<Integer, List<String>> map = new HashMap<>();
for (String word : words) {
List<String> wordList = map.get(word.length());
if (wordList == null) {
wordList = new ArrayList<String>();
wordList.add(word);
map.put(word.length(), wordList);
}
else {
wordList.add(word);
}
}
我會離開它的專家來給一個更精簡的Java 8的解決方案。
蒂姆Biegeleisen說,這裏是一個方法,如果您使用的是Java 8:
import java.util.List;
import java.util.Map;
import static java.util.stream.Collectors.*;
public class CollectByLength {
public static void main(String[] args) {
Map<Integer, List<String>> map = Stream.of("apple", "orange", "car", "can", "fuzzy")
.collect(groupingBy(String::length));
System.out.println(map); //prints {3=[car, can], 5=[apple, fuzzy], 6=[orange]}
}
}
如果你關心的List
執行出於某種原因,上述方案不提供清單上的任何擔保實現。來自文檔:
對於返回的Map或List對象的類型,可變性,可序列化或線程安全性沒有保證。
但它也可以指定List
實現你需要(LinkedList
這裏)
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import static java.util.stream.Collectors.*;
public class CollectByLength {
public static void main(String[] args) {
Map<Integer, List<String>> map = Stream.of("apple", "orange", "car", "can", "fuzzy")
.collect(groupingBy(String::length, toCollection(LinkedList::new)));
System.out.println(map); //prints {3=[car, can], 5=[apple, fuzzy], 6=[orange]}
}
}
這是我試過,但我期待的需求HashMap的是地圖<整數,ArrayList的>其中arraylist是一串長度爲整數的字 –
'singletonList()'返回的列表是不可變的,所以代碼將不起作用。 – Andreas
@JonathanBishop問題你說*「linkedlist」*現在你說'ArrayList'。這是什麼? – Andreas