Java 将列表添加到另一个Arraylist会清除输出
我有一个邻近地区的CSV文件。我已经用java读取了该文件,并创建了字符串的2D数组。我拥有的数据如下所示: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
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;
}