【问题标题】:Get rows which have equal first column from ArrayList<Arraylist<String>> [closed]从 ArrayList<Arraylist<String>> 获取第一列相等的行 [关闭]
【发布时间】:2015-03-31 11:50:06
【问题描述】:

我需要帮助从 ArrayList >

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

例如,我的列表结构是这样的:

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

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

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

【问题讨论】:

    标签: java multidimensional-array arraylist rows


    【解决方案1】:

    使用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);
    

    【讨论】:

    • 如果我使用 put (XX0123456XX, tmplist) 是否会覆盖每次迭代?
    • 不,因为我首先检查该键是否已存在于地图中。如果是这样,那么只需将其添加到该键的现有值(列表)的后面。
    • 你理解我的任务,谢谢!它有帮助!对不起我的英语不好
    【解决方案2】:

    使用 Java 1.8 流。条件:内部List的元素0必须是Barcode

    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 将遍历列表的所有元素。你不需要循环。不过你可以创建一个方法。

    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;
    }
    

    所以一旦你从用户那里得到了条件,就调用这个方法,你得到的结果是一个列表,只包含列

    【讨论】:

    • 谢谢,如果我有 10000 个条形码,我该如何循环?
    • 你不必循环这个。此行将为您提供一个结果List,其中包含符合条件的所有条形码 (Barcode == given Barcode)。如果您需要对多个条形码执行此操作,只需创建一个获取列表和条件并返回结果的方法。然后把它放在一个循环中
    • 我不知道我有什么条形码标准,我只有带有这些元素的 ArrayList。所以我不能给出标准。所以我必须用像条形码这样的参数和像事件列表的结果这样的参数来做方法?然后将其放入我的 ArrayList 的循环中?
    • 感谢帮助,但现在正是我想要的
    猜你喜欢
    • 2013-05-08
    • 2016-08-23
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2013-10-05
    • 2014-01-02
    相关资源
    最近更新 更多