从 ArrayList<Arraylist<String>> 中获取第一列相等的行

Get rows which have equal first column from ArrayList<Arraylist<String>>

我需要帮助从 ArrayList < Arraylist < String > >

中获取行中第一个元素相等的行

例如,我的列表结构如下所示:

Barcode      DepName     EventDate                 EventName
XX0123456XX  Dep1        2015-03-30 07:03:01       Sent
XX0123456XX  Dep1        2015-03-30 18:51:02       Received
XX0123456XX  Dep2        2015-03-31 01:08:04       Archived
XX9999999XX  Dep1        2015-03-30 17:22:58       Sent
XX9999999XX  Dep3        2015-03-31 12:09:43       Received
XX5555555XX  Dep1        2015-03-30 07:03:01       Sent

所以,我想从标记为 "Barcode" 的等式元素中获取 1 个对象,其中包含 EventDetails(DepName、EventDate、EventName)。例如 XX0123456XX 有包含 3 个 EventDetails 对象的列表,XX9999999XX 有包含 2 个 EventDetails 对象的列表,等等。

我怎样才能得到那些行,请帮助我

使用 Map 生成从条形码到行的映射:

Map<String, List<String>> barcodeToRows = new HashMap<>();
for (List<String> item : items) {
    String bc = item.get(0);
    if (barcodeToRows.containsKey(bc)) {
        barcodeToRows.get(bc).add(item);
    } else {
        List<String> tmpList = new ArrayList<>();
        tmpList.add(item)
        barcodeToRows.put(bc, tmpList);
    }
}

然后要获取条形码的行,您可以执行以下操作:

barcodeToRows.get(bc);

使用 Java 1.8 流。条件:内部列表的元素0必须是条码

public static void main(String[] args) {
    ArrayList<ArrayList<String>> list = new ArrayList<ArrayList<String>>();

    ArrayList<String> list1 = new ArrayList<String>();
    ArrayList<String> list2 = new ArrayList<String>();
    ArrayList<String> list3 = new ArrayList<String>();

    list1.add("XX0123456XX");
    list1.add("Dep1");
    list1.add("test");
    list1.add("Received");

    list2.add("XX0123456XX");
    list2.add("Dep1");
    list2.add("test2");
    list2.add("Archived");

    list3.add("XX12344XX");
    list3.add("Dep2");
    list3.add("Test");
    list3.add("Sent");

    list.add(list1);
    list.add(list2);
    list.add(list3);

    //setup done. the following line is the important one

    List<ArrayList<String>> result = list.stream().filter(l -> l.get(0).equals("XX0123456XX")).collect(Collectors.toList());

    //test output

    result.forEach(l -> {
        l.forEach(s -> System.out.print(s+" "));
        System.out.println();
        });


}

关于循环的问题。 Stream 将 运行 遍历 List 的所有元素。你不需要循环。不过,您可以创建一个方法。

public List<ArrayList<String>> getResult(List<ArrayList<String>> list, String userSearchInput){
    List<ArrayList<String>> result = list.stream().filter(l -> l.get(0).equals(userSearchInput)).collect(Collectors.toList());

    return result;
}

因此,一旦您从用户那里获得了条件,就调用此方法,您得到的结果是一个列表,仅包含列