Java 数组列表中的聚合字符串

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

我有一个字符串数组的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"}
{"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
                            }
                        }
谢谢

  • 为前5列创建您自己的键类,或将它们连接成字符串(可能适合您的用例,也可能不适合您的用例)
  • 使用字符串、StringBuilder或值/连接字段列表,将所有内容添加到由key类设置关键帧的映射中
  • 将所有数据解析到映射后,迭代映射以将所有内容放回列表中,循环连接每个键的值
  • 根据排序首选项对新列表进行排序(或者,最初使用LinkedHashMap维护已排序的映射)
  • 使用番石榴可能更容易做到以上几点

    比如说

    // 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
    等于

  • 为前5列创建您自己的键类,或将它们连接成字符串(可能适合您的用例,也可能不适合您的用例)
  • 使用字符串、StringBuilder或值/连接字段列表,将所有内容添加到由key类设置关键帧的映射中
  • 将所有数据解析到映射后,迭代映射以将所有内容放回列表中,循环连接每个键的值
  • 根据排序首选项对新列表进行排序(或者,最初使用LinkedHashMap维护已排序的映射)
  • 使用番石榴可能更容易做到以上几点

    比如说

    // 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]