Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中如何将两个数组映射到一个HashMap?_Java_Arrays_Arraylist_Hashmap - Fatal编程技术网

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

在Java中如何将两个数组映射到一个HashMap?,java,arrays,arraylist,hashmap,Java,Arrays,Arraylist,Hashmap,我有两个字符串数组。名字很短的人 // days short name String[] shortNames = {"SUN", "MON", "...", "SAT"}; 另一个名字很长 // days long name String[] longNames = {"SUNDAY", "MONDAY", "....", "SATURDAY"}; 两者具有相同数量的元素。如何在HashMap中将短名称映射为键,将长名称映射为值 HashMap<String, String>

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

// days short name
String[] shortNames = {"SUN", "MON", "...", "SAT"};
另一个名字很长

// days long name
String[] longNames = {"SUNDAY", "MONDAY", "....", "SATURDAY"};
两者具有相同数量的元素。如何在HashMap中将短名称映射为键,将长名称映射为值

HashMap<String, String> days = new HashMap<>();
HashMap days=newhashmap();

我知道,我可以通过循环来实现。有更好的方法吗?

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

Map<String, String> days = IntStream.range(0, shortNames.length).boxed()
    .collect(Collectors.toMap(i -> shortNames[i], i -> longNames[i]));
Map days=IntStream.range(0,shortNames.length).boxed()
.collect(Collectors.toMap(i->shortNames[i],i->longNames[i]);
有一些第三方Java库包含一个“zip”函数,用于获取两个流并生成从一个流到另一个流的映射。但实际上,它们只是实现上述代码的更简洁的方法。

对我来说不起作用,因为
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);
    }
}
package learning.java8;
导入静态java.util.stream.Collectors.*;
导入静态org.junit.Assert.*;
导入java.time.DayOfWeek;
导入java.time.format.TextStyle;
导入java.util.array;
导入java.util.LinkedHashMap;
导入java.util.Locale;
导入java.util.Map;
导入java.util.stream.IntStream;
导入org.junit.Test;
公共类集成{
@试验
公开作废q30339679(){
最终字符串[]shortNames=getDayOfWeekNamesInEnglish(TextStyle.SHORT);
最后一个字符串[]longNames=getDayOfWeekNamesInEnglish(TextStyle.FULL);
最终映射天数=IntStream.range(0,shortNames.length).boxed()
.collect(toMap(i->shortNames[i],i->longNames[i]);
系统输出打印项次(天);
最终映射排序=IntStream.range(0,shortNames.length).boxed()
.收集(
i->shortNames[i],i->longNames[i],
(i,j)->i,LinkedHashMap::new);
系统输出打印项次(已排序);
assertEquals({周一=周一,周二=周二,周三=周三,周四=周四,“
+“Fri=Friday,Sat=Saturday,Sun=Sunday}”,排序为.toString());
}
私有静态字符串[]GetDayOfWeekNameInEnglish(最终文本样式){
返回Arrays.stream(DayOfWeek.values())
.map(day->day.getDisplayName(style,Locale.ENGLISH))
.toArray(字符串[]::新建);
}
}

另请参见:

您可以使用
org.apache.commons.lang3.ArrayUtils

以下是一个例子:

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

我认为在这种情况下,循环是最好的方法——当这两个数组的大小相同时。为什么首先要存储在数组中?java 7及以下版本呢?@10sw33低于java 8(除了升级!)您仍然有一些选择。使用第三方库或使用
Arrays.toList(shortNames).forEach
浏览一个数组中的所有项目并添加地图条目。我知道这实际上只是用另一个名称进行的迭代,但流也是如此@短跑运动员回答得很好,但他需要拳击,正如延斯在下面所说的。