2016-03-03 76 views
1

我想了解一個編程問題,例如,我給了一個單詞列表(蘋果,橙色,汽車,可以,模糊)我會得到一個散列表與關鍵字的長度以及用於值的單詞的鏈接列表。例如,給定一個字符串列表,創建一個長度和字符串的散列表

(3, {car, can}) 
(5, {apple, fuzzy}) 
(6, {orange}) 

我該如何構建它?我對Java比較陌生,只知道如何讀取字符串輸入並獲取每個字符串的長度。但很不熟悉hashmaps。有人能指引我朝着正確的方向嗎?

回答

0

這是一個相當簡潔的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的解決方案。

+0

這是我試過,但我期待的需求HashMap的是地圖<整數,ArrayList的>其中arraylist是一串長度爲整數的字 –

+1

'singletonList()'返回的列表是不可變的,所以代碼將不起作用。 – Andreas

+0

@JonathanBishop問題你說*「linkedlist」*現在你說'ArrayList'。這是什麼? – Andreas

1

蒂姆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]} 
    } 
}