Java 数组列表中的聚合字符串
我有一个字符串数组的Arraylist,已经由下面的值(列和行)填充 我希望通过对当前Arraylist进行排序来创建一个新的Arraylist,并获取具有相同键的行(按顺序:name、sname、Id1、Id2、type),将它们的值连接到一行中的一列(以;)中 预期产出:Java 数组列表中的聚合字符串,java,arraylist,Java,Arraylist,我有一个字符串数组的Arraylist,已经由下面的值(列和行)填充 我希望通过对当前Arraylist进行排序来创建一个新的Arraylist,并获取具有相同键的行(按顺序:name、sname、Id1、Id2、type),将它们的值连接到一行中的一列(以;)中 预期产出: {"name","sname","Id1","Id2","type","Comment"} {"test1","abc","20","50","t1","SD1,0,1; SD3,0,1; SD5,2,19"} {"tes
{"name","sname","Id1","Id2","type","Comment"}
{"test1","abc","20","50","t1","SD1,0,1; SD3,0,1; SD5,2,19"}
{"test1","HJc","53","50","t1","SD3,0,1"}
{"test2","znc","21","23","t1","SF5,3,4; SF1,1,6; SF12,17,36"}
{"test3","ldb","19","54","t1","SR44,19,31;SR51,6,1 }
{"test4","lYI","76","56","t1","TB77,54,87"}
My Arraylist是根据结果查询生成的:
// header
String[] myString0 = {"name","sname","Id1","Id2","type","LDP","oldvalue","newvalue"};
//lines
while (rset.next()) {
String name = rset.getString("name");
String sname = rset.getString("sname");
String Id1 = rset.getString("Id1");
String Id2 = rset.getString("Id2");
String type = rset.getString("type");
String LDP = rset.getString("LDP");
String oldvalue = rset.getString("oldvalue");
String newvalue = rset.getString("newvalue");
String[] myString1 = {name, sname, Id1, Id2, "type", LDP, oldvalue, newvalue};
outerArr.add(myString1);// my Arraylist
}
}
谢谢
// for each row...
myArrayListMultiMap.put(new MyKey(name, sname, id1, id2, type), LDP + "," + oldValue + "," + newValue);
// then
for (MyKey key : myArrayListMultiMap.keySet()) {
List<String> values = myArrayListMultiMap.get(key);
String concatenated = StringUtils.join(values, ";");
myList.add(new Row(entry.getKey(), concatenated));
}
Collections.sort(myList, myComparator);
//对于每一行。。。
myArrayListMultiMap.put(新的MyKey(名称、sname、id1、id2、类型)、LDP+“、“+oldValue+”、“+newValue”);
//然后
对于(MyKey:myArrayListMultiMap.keySet()){
列表值=myArrayListMultiMap.get(键);
字符串连接=StringUtils.join(值“;”);
add(新行(entry.getKey(),连接));
}
Collections.sort(myList,myComparator);
重要提示:确保MyKey类实现了hashCode
和等于
// for each row...
myArrayListMultiMap.put(new MyKey(name, sname, id1, id2, type), LDP + "," + oldValue + "," + newValue);
// then
for (MyKey key : myArrayListMultiMap.keySet()) {
List<String> values = myArrayListMultiMap.get(key);
String concatenated = StringUtils.join(values, ";");
myList.add(new Row(entry.getKey(), concatenated));
}
Collections.sort(myList, myComparator);
//对于每一行。。。
myArrayListMultiMap.put(新的MyKey(名称、sname、id1、id2、类型)、LDP+“、“+oldValue+”、“+newValue”);
//然后
对于(MyKey:myArrayListMultiMap.keySet()){
列表值=myArrayListMultiMap.get(键);
字符串连接=StringUtils.join(值“;”);
add(新行(entry.getKey(),连接));
}
Collections.sort(myList,myComparator);
重要注意事项:确保MyKey类实现了
hashCode
和equals
以下是一个使用Streams的解决方案,并从Guava的实用程序中获得了一些帮助:
公共静态列表聚合(列表数据){
列表聚合=data.stream()
.skip(1)
.map(数组::asList)
.collect(收集器.groupingBy(
a->a.子列表(0,5),
()->新树形图(
Ordering.from(字符串.不区分大小写\u顺序)
.lexicographical()),
图(
a->String.join(“,”,a.subList(5,8)),
收集器。连接(“;”))
.entrySet()
.stream()
.map(e->Stream.concat(
e、 getKey().stream(),
流(例如getValue()))
.map(s->s.toArray(字符串[]:::新建))
.collect(收集器.toCollection(ArrayList::new));
添加(0,新字符串[]{“name”、“sname”、“Id1”、“Id2”、“type”、“Comment”});
累计收益;
}
测试:
publicstaticvoidmain(字符串[]args){
列表数据=数组.asList(新字符串[][]{
{“名称”、“sname”、“Id1”、“Id2”、“类型”、“LDP”、“旧值”、“新值”},
{“test1”、“abc”、“20”、“50”、“t1”、“SD1”、“0”、“1”},
{“test2”、“znc”、“21”、“23”、“t1”、“SF5”、“3”、“4”},
{“test1”、“abc”、“20”、“50”、“t1”、“SD3”、“0”、“1”},
{“test1”、“HJc”、“53”、“50”、“t1”、“SD3”、“0”、“1”},
{“test2”、“znc”、“21”、“23”、“t1”、“SF1”、“1”、“6”},
{“test1”、“abc”、“20”、“50”、“t1”、“SD5”、“2”、“19”},
{“test3”、“ldb”、“19”、“54”、“t1”、“SR51”、“6”、“1”},
{“test2”、“znc”、“21”、“23”、“t1”、“SF12”、“17”、“36”},
{“test3”、“ldb”、“19”、“54”、“t1”、“SR44”、“19”、“31”},
{“test4”、“lYI”、“76”、“56”、“t1”、“TB77”、“54”、“87”}
});
聚合(数据)
.stream()
.map(数组::toString)
.forEach(System.out::println);
}
输出:
[name, sname, Id1, Id2, type, Comment]
[test1, abc, 20, 50, t1, SD1,0,1; SD3,0,1; SD5,2,19]
[test1, HJc, 53, 50, t1, SD3,0,1]
[test2, znc, 21, 23, t1, SF5,3,4; SF1,1,6; SF12,17,36]
[test3, ldb, 19, 54, t1, SR51,6,1; SR44,19,31]
[test4, lYI, 76, 56, t1, TB77,54,87]
[名称、sname、Id1、Id2、类型、注释]
[test1,abc,20,50,t1,SD1,0,1;SD3,0,1;SD5,2,19]
[test1,HJc,53,50,t1,SD3,0,1]
[test2,znc,21,23,t1,SF5,3,4;SF1,1,6;SF12,17,36]
[test3,ldb,19,54,t1,SR51,6,1;SR44,19,31]
[测试4,lYI,76,56,t1,TB77,54,87]
下面是一个使用Streams的解决方案,借助Guava的实用程序:
公共静态列表聚合(列表数据){
列表聚合=data.stream()
.skip(1)
.map(数组::asList)
.collect(收集器.groupingBy(
a->a.子列表(0,5),
()->新树形图(
Ordering.from(字符串.不区分大小写\u顺序)
.lexicographical()),
图(
a->String.join(“,”,a.subList(5,8)),
收集器。连接(“;”))
.entrySet()
.stream()
.map(e->Stream.concat(
e、 getKey().stream(),
流(例如getValue()))
.map(s->s.toArray(字符串[]:::新建))
.collect(收集器.toCollection(ArrayList::new));
聚合。添加(0,新字符串[]{“name”,“s
public static void main(String[] args) {
List<String[]> data = Arrays.asList(new String[][] {
{"name","sname","Id1","Id2","type","LDP","oldvalue","newvalue"},
{"test1","abc","20","50","t1","SD1","0","1"},
{"test2","znc","21","23","t1","SF5","3","4"},
{"test1","abc","20","50","t1","SD3","0","1"},
{"test1","HJc","53","50","t1","SD3","0","1"},
{"test2","znc","21","23","t1","SF1","1","6"},
{"test1","abc","20","50","t1","SD5","2","19"},
{"test3","ldb","19","54","t1","SR51","6","1"},
{"test2","znc","21","23","t1","SF12","17","36"},
{"test3","ldb","19","54","t1","SR44","19","31"},
{"test4","lYI","76","56","t1","TB77","54","87"}
});
aggregate(data)
.stream()
.map(Arrays::toString)
.forEach(System.out::println);
}
[name, sname, Id1, Id2, type, Comment]
[test1, abc, 20, 50, t1, SD1,0,1; SD3,0,1; SD5,2,19]
[test1, HJc, 53, 50, t1, SD3,0,1]
[test2, znc, 21, 23, t1, SF5,3,4; SF1,1,6; SF12,17,36]
[test3, ldb, 19, 54, t1, SR51,6,1; SR44,19,31]
[test4, lYI, 76, 56, t1, TB77,54,87]