Java 将列表添加到另一个Arraylist会清除输出

Java 将列表添加到另一个Arraylist会清除输出,java,arrays,arraylist,Java,Arrays,Arraylist,我有一个邻近地区的CSV文件。我已经用java读取了该文件,并创建了字符串的2D数组。我拥有的数据如下所示: 100 , 101 100, 102 100, 152 200, 201 200, 202 100 101 102 152 200 201 202 该数据意味着区域100与101102152相邻。 我想创建一个新的二维数组,其中第一个元素是“键”,下面的元素是相邻的区域。大概是这样的: 100 , 101 100, 102 100, 152 200, 201 200, 202 10

我有一个邻近地区的CSV文件。我已经用java读取了该文件,并创建了字符串的2D数组。我拥有的数据如下所示:

100 , 101
100, 102
100, 152
200, 201
200, 202
100 101 102 152
200 201 202
该数据意味着区域100与101102152相邻。 我想创建一个新的二维数组,其中第一个元素是“键”,下面的元素是相邻的区域。大概是这样的:

100 , 101
100, 102
100, 152
200, 201
200, 202
100 101 102 152
200 201 202
我使用了一个字符串数组,因为有些值不是全部整数

以下是我所尝试的:

List<List<String>> outputLines = new ArrayList<>();
    List<String> inner = new ArrayList<>();
    for(int i =0; i<lines.size();i++){

        if(inner.isEmpty()){
            inner.add(array[i][0]);
            inner.add(array[i][1]);
        }
        else if(inner.get(0).equals(array[i][0])){
            inner.add(array[i][1]);
        }
        else{
            outputLines.add(inner);
            inner.clear();
            inner.add(array[i][0]);
            inner.add(array[i][1]);
        }`
List outputLines=new ArrayList();
列表内部=新的ArrayList();

对于(inti=0;i我已经为您的输出编写了一个sudo逻辑,您也可以这样做

请仔细阅读下面的代码

public class Main {

    static int array[][]={{100,101},{100,102},{100,152},{200,300},{200,500}};
    static Map m =new HashMap();
    public static void main(String[] args) {
        for (int[] innerArray: array) {
            if(!m.containsKey(innerArray[0])){
                List tempLst=new ArrayList<>();
                tempLst.add(innerArray[1]);
                m.put(innerArray[0], tempLst);
            }
            else
            {
                List tempLst=(ArrayList)m.get(innerArray[0]);
                tempLst.add(innerArray[1]);
                m.put(innerArray[0], tempLst);
            }
        }
        System.out.println(Arrays.asList(m)); // method 1

    }
}
公共类主{
静态int数组[][]={{100101}、{100102}、{100152}、{200300}、{200500};
静态映射m=新的HashMap();
公共静态void main(字符串[]args){
for(int[]innerArray:array){
如果(!m.containsKey(innerArray[0])){
List templast=new ArrayList();
add(innerArray[1]);
m、 put(内部数组[0],模板);
}
其他的
{
List templast=(ArrayList)m.get(innerArray[0]);
add(innerArray[1]);
m、 put(内部数组[0],模板);
}
}
System.out.println(Arrays.asList(m));//方法1
}
}

输出:[{100=[101102152],200=[300500]}]

它们是同一个对象,如果您想保持
输出行
列表中的值不变,那么您需要
克隆
它谢谢您,先生,这很好地解决了我的问题!只需创建一个新列表而不是清除旧列表,即
internal=new ArrayList();
而不是
internal.clear()
。我建议您使用
映射
而不是
列表
。映射更适合解决此问题请注意,这不一定会在输入中添加最后一行。
public static Map<String, Set<String>> group(List<String> lines) {
    final Pattern comma = Pattern.compile(",\\s*");
    Map<String, Set<String>> map = new TreeMap<>();

    lines.stream()
        .map(comma::split)
        .forEach(line -> map.compute(line[0], (region, neighbors) -> {
            neighbors = neighbors != null ? neighbors : new TreeSet<>();
            neighbors.add(line[1]);
            return neighbors;
        }));

    return map;
}