2016-03-03 81 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]} 
    } 
}