java中arraylists的配对值

时间:2014-10-07 03:51:13

标签: java arraylist

我有这个问题,我不知道如何接近。我有两个数组列表,一个包含String,另一个包含整数,如下所示:

 *  Utah           5
 *  Nevada         6
 *  California    12
 *  Oregon        8
 *  Utah          9
 *  California   10
 *  Nevada        4
 *  Nevada        4
 *  Oregon       17
 *  California    6

我需要在数组列表中生成这样的结果: 犹他[5,9]内华达[6,4,4]加利福尼亚[12,10,6]。

老实说,我不知道如何处理这个问题,而且我正在寻找关于如何做到这一点的建议。

我被建议使用arraylist of arraylist,这是我到目前为止所做的。

    int i=0;
        ArrayList<ArrayList<Integer>> values  = new ArrayList<ArrayList<Integer>>();

        while (i<categories.size())
        {
            String cat=categories.get(i);
            i++;
            for (int r = 0; r < column1.size();r++) {
                if(column1.get(r)==cat)
                {
                    int value = column2.get(r);
                    ArrayList<Integer> val=new ArrayList<Integer>();
                    val.add(value);
                    values.add(val);
                }
        }

Column1 =状态列表,column2 =整数列表和categories = categories list。

我现在的问题是for循环似乎只是一遍又一遍地添加相同的数组,直到while循环完成。有什么建议吗?

3 个答案:

答案 0 :(得分:5)

您可以使用以下方法解决问题:

List<String> states = Arrays.asList(
        "Utah", "Nevada", "California", "Oregon", "Utah",
        "California", "Nevada", "Nevada", "Oregon", "California"
    );

List<Integer> values = Arrays.asList(5, 6, 12, 8, 9, 10, 4, 4, 17, 6);


Map<String, List<Integer>> resultMap =HashMap<String, Arraylist<>>();

for(int i = 0; i < states.size(); i++) 
    {
           if( resultMap.get(states.get(i))!=null){
              resultMap.get(states.get(i)).add(values.get(i));
           }else{
            List<Integer> valuelist = new ArrayList<>();
             valuelist.add(values.get(i));
             resultMap.put(states.get(i),valuelist);
          }
    }  

resultMap包含您所需的答案。

答案 1 :(得分:2)

这个似乎就像一个家庭作业级别的问题,并且使用Integer Map列表String来解决这个问题相对简单明了}。我正在回答演示一些较新的 Java 8 功能:

    List<String> states = Arrays.asList(
        "Utah", "Nevada", "California", "Oregon", "Utah",
        "California", "Nevada", "Nevada", "Oregon", "California"
    );
    List<Integer> values = Arrays.asList(
        5,  6, 12,  8, 9,
        10, 4,  4, 17, 6
    );
    assert states.size() == values.size();

    Map<String, List<Integer>> collated = new LinkedHashMap<>();
    for (int i = 0, len = states.size(); i < len; i++) {
        String state = states.get(i);
        Integer value = values.get(i);
        collated.computeIfAbsent(state, x -> new ArrayList<>()).add(value);
    }
    collated.forEach( (k,v) -> System.out.printf("%s %s%n", k, v) );

输出:

Utah [5, 9]
Nevada [6, 4, 4]
California [12, 10, 6]
Oregon [8, 17]

答案 2 :(得分:1)

这是使用Java 8功能计算此功能的另一种方法,但这次使用的是流。 (脚手架来自@William Price's answer

List<String> states = Arrays.asList(
    "Utah", "Nevada", "California", "Oregon", "Utah",
    "California", "Nevada", "Nevada", "Oregon", "California"
);
List<Integer> values = Arrays.asList(5, 6, 12, 8, 9, 10, 4, 4, 17, 6);
assert states.size() == values.size();

Map<String, List<Integer>> collated = IntStream.range(0, states.size()).boxed().collect(
    Collectors.groupingBy(states::get, LinkedHashMap::new,
        Collectors.mapping(values::get, Collectors.toList())));

collated.forEach((k,v) -> System.out.printf("%s %s%n", k, v));

使用多个输入源在流中可能很不方便,但使用索引流非常适合这种“对应列表”情况。 groupingBy按照states列表中的值对索引进行分类,mapping将索引映射到values列表中的值,然后toList收集他们进入一个清单。使用LinkedHashMap会保留插入顺序。