Java中如何将两个数组映射到一个HashMap?

问题描述 投票:0回答:4

我有两个字符串数组。一个名字很短的。

// 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<>();

我知道,我可以通过循环来制作。有更好的办法吗?

java arrays arraylist hashmap
4个回答
36
投票

有很多方法可以做到这一点。相当容易理解和应用的一种方法是使用 Java 8 流和收集器将索引流映射到键值对:

Map<String, String> days = IntStream.range(0, shortNames.length).boxed()
    .collect(Collectors.toMap(i -> shortNames[i], i -> longNames[i]));

有一些第三方 Java 库包含“zip”函数,可以获取两个流并生成从一个流到另一个流的映射。但实际上,它们只是实现与上面代码相同的事情的更简洁的方法。


3
投票

接受的答案对我不起作用,因为

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);
    }
}

另请参阅:为什么原始 Stream 没有收集(Collector)?


3
投票

您可以使用

org.apache.commons.lang3.ArrayUtils

这是一个例子:

Map colorMap = ArrayUtils.toMap(new String[][] {
    {"RED", "#FF0000"},
    {"GREEN", "#00FF00"},
    {"BLUE", "#0000FF"}});

0
投票

Google Guava 库具有

Streams.zip
方法,它将两个流压缩为一个流。 然后可以将压缩的流收集到
Map
中。

Map<String, String> days =
        Streams.zip(Arrays.stream(shortNames), Arrays.stream(longNames), Map::entry)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
© www.soinside.com 2019 - 2024. All rights reserved.