java中ArrayList的值对

java中ArrayList的值对,java,arraylist,Java,Arraylist,我有一个我不知道如何解决的问题。我有两个数组列表,一个包含字符串,另一个包含整数,如下所示: * Utah 5 * Nevada 6 * California 12 * Oregon 8 * Utah 9 * California 10 * Nevada 4 * Nevada 4 * Oregon 17 * California 6

我有一个我不知道如何解决的问题。我有两个数组列表,一个包含字符串,另一个包含整数,如下所示:

 *  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=类别列表

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

这似乎是一个家庭作业级别的问题,使用字符串键控的映射中的整数列表来解决这个问题相对简单。我回答这个问题是为了演示一些较新的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) );

这里有另一种使用Java8特性计算的方法,但这次是使用streams。脚手架


在流中处理多个输入源可能会很尴尬,但使用索引流非常适合这种对应的列表情况。groupingBy根据状态列表中的值对索引进行分类,将索引映射到值列表中的值,然后toList将它们收集到一个列表中。使用LinkedHashMap保留插入顺序。

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

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包含您所需的答案。

Map?为什么不再创建两个ArrayList,一个保存名称但只保存每个名称的一个实例,然后再创建一个将通过第一个而不是第三个ArrayList的ArrayList,如果该值与某个值匹配,则需要一个循环从第三个ArrayList遍历它们,然后将该值附加到第四个arraylist,然后重复。我想那会管用的。这是家庭作业吗?是的,这是家庭作业,但我想我不知道的是如何知道犹他州、内华达州、加利福尼亚州类别前面的值,因为我看不到它们,我只是想也许只是通过索引号?Guava库提供了一个实现,这使您可以轻松、清晰地将键与多个值关联。作为家庭作业,使用外部图书馆可能不是练习的重点,但解决这类问题的正确方法是使用多重地图。谢谢你,我正在努力了解这是如何工作的,但老实说,有几件事我一点都不熟悉。就像地图上的钥匙一样。我会一直试着去理解它。从谷歌搜索你不熟悉的类名开始。阅读这些API类及其方法的Javadoc,如果您仍然感到困惑,请再次阅读它们。+1演示流和收集器的良好变体。对于一个普通的学生来说,一开始可能很难掌握,但对于这个a-ha来说,潜力更大!灯泡时刻。这是怎么得到6票的?它甚至不编译。这是解决问题的方法…它不是100%无语法错误的@JeffreyBosboom。。
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);
          }
    }