java 两个字符串数组对应拼接问题

 String[] cols = "name,age,gender,phone".split(",", -1);
 String[] message = "abc\tdef\t123\t456".split("\\t", -1);

 // 这两个字符串组数一一对应,然后组成map

 key—value
 name:abc,age:def,gender:123,phone:456

有没有工具类,不用for 去遍历?

阅读 6.2k
5 个回答

如果你用上了 Java8:

public static void main(String[] args) throws Exception {
    String[] cols = "name,age,gender,phone".split(",", -1);
    String[] message = "abc\tdef\t123\t456".split("\\t", -1);

    Map<String, String> map
            = IntStream.range(0, cols.length)
                       .boxed()
                       .collect(Collectors.toMap(i -> cols[i], i -> message[i]));

    map.forEach((k, v) -> System.out.println(k + " -> " + v));
}

运行结果:
运行结果

为什么会有这么奇怪的要求,不用 for。遍历肯定是个循环操作,循环就 for 和两种 while,不用 for 那就用 while 呗……

另外,你可以用 stream 对遍历处理的封装,如果不幸没用上 Java8,那就自己写个封装再调用……

首先声明这个答案一下纯属娱乐,从实用角度来说毫无益处。
但是确实完全满足了生成map的时候没有for循环。
至于使用map的时候嘛……

public class MapTest {
    @Test
    public void testMakeMap() throws Exception {
        String[] cols = "name,age,gender,phone".split(",", -1);
        String[] message = "abc\tdef\t123\t456".split("\\t", -1);

        Map<String, String> map = toMap(cols, message);

        assertThat(map.get("name"), is("abc"));
        assertThat(map.get("phone"), is("456"));
        assertThat(map.get("age"), is("def"));
        assertThat(map.get("gender"), is("123"));
    }

    private Map<String,String> toMap(String[] keys, String[] values) {
        return new AbstractMap<String, String>(){
            public Set<Entry<String, String>> entrySet() {
                return new AbstractSet<Entry<String, String>>() {
                    public int size() {
                        return keys.length;
                    }
                    public Iterator<Entry<String, String>> iterator() {
                        return new Iterator<Entry<String, String>>(){
                            int i = 0;
                            public boolean hasNext() {
                                return i < keys.length;
                            }
                            public Entry<String, String> next() {
                                int current = i++;
                                return new Entry<String, String>() {
                                    public String getKey() {
                                        return keys[current];
                                    }
                                    public String getValue() {
                                        return values[current];
                                    }
                                    public String setValue(String s) {
                                        throw new UnsupportedOperationException();
                                    }
                                };
                            }
                        };
                    }
                };
            }
        };
    }
}

没有现成的工具类,你可以写一个工具类,里面用 for 循环,这样你调用的时候就不用写 for 循环了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题