【问题标题】:how to loop in a collection of ArrayList如何在 ArrayList 集合中循环
【发布时间】:2019-10-11 07:49:39
【问题描述】:

我有一个哈希映射,键是一个字符串,值是数组列表,我想检查数组列表是否包含一个值,然后检索该值的键。所以我这样做了:

Collection<ArrayList<String>> emailList = AddressBook.addressMap.values();
    Iterator<ArrayList<String>> iterator = emailList.iterator();

使用循环我可以打印列表,但我无法检查它是否等于字符串。我如何访问数组列表中的每个字符串并使用等于

【问题讨论】:

  • 迭代时,数组列表中应该有一个get方法可以取回值。

标签: java dictionary arraylist collections


【解决方案1】:

您可以使用流来做到这一点。这将返回包含所需值的每个映射列表的所有键。

      Map<String, List<String>> map = new HashMap<>();
      map.put("list1", Arrays.asList("Apples", "Oranges", "Bananas"));
      map.put("list2", Arrays.asList("Grapes", "Kiwi", "Apples"));
      map.put("list3", Arrays.asList("Mangos", "Kiwi", "Berries"));

      String val = "Kiwi";
      List<String> keys = map.entrySet().stream().filter(
            entry -> entry.getValue().contains(val)).map(
                  entry -> entry.getKey()).collect(Collectors.toList());

      System.out.println(keys);

它的工作原理如下:

  • 将映射的 entrySet 映射到 entrySet 流。
  • 通过检查值(项目列表)来过滤条目值,以查看它是否包含所需的项目。
  • 如果是,则将结果映射到该列表的条目键。
  • 收集列表中的键。
For the search val of Kiwi
This produces the output  [list3, list2]

如果你想在找到第一个条目后停下来,你可以稍微改变一下。

       for (String item : List.of("Apples", "Fish")) {

          String key = map.entrySet().stream().filter(
               entry -> entry.getValue().contains(item)).map(
                     entry -> entry.getKey()).findFirst().orElse(
                           "Not Found");

         System.out.println("Key for item " + item + " = " + key);

      }

这会产生以下输出。

Key for item Apples = list1
Key for item Fish = Key Not Found

这使用findFirst 在找到第一个后停止。由于它返回一个 Optional,orElse 方法可用于指定一个默认值以指示没有列表包含该项目。

您还可以指定并行以使用线程来处理这些流。这可以大大提高处理速度。特别是如果您有多个内核。

【讨论】:

    【解决方案2】:

    你可以试试这样的。由于哈希图中的值是 ArrayList 的值,因此您必须遍历数组列表的集合,然后检查数组列表中的字符串:

    For (ArrayList list : emailList ){
    
        if(emailList.contains(stringVALUE)){
            // do some stuff
        }
    }
    

     For (ArrayList list : emailList ){
    
       For(String s: list){
           if(s.equals(theValueYouAreLookingFor)){
              //do some stuff
           }
    
       }
    
    }
    

    【讨论】:

    • 1) for 小写 f 2) 不要使用原始类型; for(String s: list) 不适用于 list 的原始类型 ArrayList
    【解决方案3】:
    Map<String,List> map = new HashMap<>();
        map.put( "list1", Arrays.asList( "Hello1", "Hello2" ) );
        map.put( "list2", Arrays.asList( "Hi", "Hi2" ) );
    
        for ( String key : map.keySet() ) {
    
            List list = map.get( key );
            if ( list.contains( "Hi2" ) ) {
                System.out.println( "This key contained the string " + key );
                break;
            }
        }
    

    【讨论】:

      【解决方案4】:

      使用嵌套循环:

      for(List<String> list:emailList)
         for(String s:list) {
            // Logic
         }
      

      这将允许您遍历整个 CollectionArrayLists 中的每个字符串。

      【讨论】:

        【解决方案5】:

        请看:

        String key = null;
        for (Map.Entry<String, ArrayList<String>> emailListEntry : AddressBook.addressMap.entrySet()) {
            for (String email: emailListEntry.getValue()){
                if(email.equals("TEST")){
                    key =  emailListEntry.getKey(); 
                    break;
                }
            }
            if (key!=null){
                break;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-14
          • 2022-01-10
          • 1970-01-01
          • 1970-01-01
          • 2018-12-25
          • 2019-11-18
          • 1970-01-01
          • 2020-02-28
          相关资源
          最近更新 更多