如何循环访问ArrayList

时间:2019-05-24 17:32:09

标签: java dictionary arraylist collections

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

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

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

5 个答案:

答案 0 :(得分:0)

使用嵌套循环:

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

这将允许您在Collection的整个ArrayList中迭代每个String。

答案 1 :(得分:0)

您可以尝试类似的方法。由于哈希图中的值是ArrayList的值,因此您必须遍历arraylist的集合,然后检查arraylist中的字符串:

For (ArrayList list : emailList ){

    if(emailList.contains(stringVALUE)){
        // do some stuff
    }
}

OR

 For (ArrayList list : emailList ){

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

   }

}

答案 2 :(得分:0)

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

      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映射到entrySets流。
  • 通过检查值(项目列表)来筛选条目值,以查看其是否包含所需的项目。
  • 如果是,则将结果映射到该列表的输入键。
  • 收集列表中的键。
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在找到第一个后停止。由于orElse方法返回可选值,因此可以用来指定默认值,以指示没有列表包含该项目。

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

答案 3 :(得分:-1)

请看看:

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

答案 4 :(得分:-1)

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