我有两个String数组。一个名字很短。
// days short name
String[] shortNames = {"SUN", "MON", "...", "SAT"};
另一个名字很长。
// days long name
String[] longNames = {"SUNDAY", "MONDAY", "....", "SATURDAY"};
两者都有相同数量的元素。如何在HashMap中将短名称映射为KEY,将长名称映射为VALUE?
HashMap<String, String> days = new HashMap<>();
我知道,我可以通过循环来制作。还有更好的方法吗?
答案 0 :(得分:20)
有很多方法可以做到这一点。一个相当容易理解和应用的方法是使用Java 8流和收集器从索引流映射到键值对:
Map<String, String> days = IntStream.range(0, shortNames.length).boxed()
.collect(Collectors.toMap(i -> shortNames[i], i -> longNames[i]));
有些第三方Java库包含了一个&#39; zip&#39;用于获取两个流并生成从一个到另一个的映射。但实际上它们只是实现与上述代码相同的更简洁的方式。
答案 1 :(得分:1)
accepted answer对我不起作用,因为IntStream
没有提供单参数collect
方法。
尽管如此,要从toMap
收集器中受益,您必须先将int
基元打包到Integer
个对象中。如果您想保留元素顺序,请使用toMap
的扩展版本和LinkedHashMap::new
,如下所示:
package learning.java8;
import static java.util.stream.Collectors.*;
import static org.junit.Assert.*;
import java.time.DayOfWeek;
import java.time.format.TextStyle;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Locale;
import java.util.Map;
import java.util.stream.IntStream;
import org.junit.Test;
public class IntStreamLT {
@Test
public void q30339679() {
final String[] shortNames = getDayOfWeekNamesInEnglish(TextStyle.SHORT);
final String[] longNames = getDayOfWeekNamesInEnglish(TextStyle.FULL);
final Map<String, String> days = IntStream.range(0, shortNames.length).boxed()
.collect(toMap(i -> shortNames[i], i -> longNames[i]));
System.out.println(days);
final Map<String, String> sorted = IntStream.range(0, shortNames.length).boxed()
.collect(toMap(
i -> shortNames[i], i -> longNames[i],
(i, j) -> i, LinkedHashMap::new));
System.out.println(sorted);
assertEquals("{Mon=Monday, Tue=Tuesday, Wed=Wednesday, Thu=Thursday, "
+ "Fri=Friday, Sat=Saturday, Sun=Sunday}", sorted.toString());
}
private static String[] getDayOfWeekNamesInEnglish(final TextStyle style) {
return Arrays.stream(DayOfWeek.values())
.map(day -> day.getDisplayName(style, Locale.ENGLISH))
.toArray(String[]::new);
}
}
答案 2 :(得分:1)
您可以使用Map colorMap = ArrayUtils.toMap(new String[][] {
{"RED", "#FF0000"},
{"GREEN", "#00FF00"},
{"BLUE", "#0000FF"}});
。
以下是一个例子:
dplyr