我想了解一个编程问题,例如,我给了一个单词列表(苹果,橙色,汽车,可以,模糊)我会得到一个散列表与关键字的长度以及用于值的单词的链接列表。例如,给定一个字符串列表,创建一个长度和字符串的散列表
(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