【问题标题】:Iterating through multiple predefined ArrayLists using a method使用方法遍历多个预定义的 ArrayList
【发布时间】:2018-01-29 10:20:33
【问题描述】:

我已经定义了一些已经填充的 ArrayList。我在数组“tagArrays”中有所有我想遍历的名称。是否有可能以与我相似的逻辑遍历它们中的每一个。我知道这段代码行不通,但是我不确定代码应该是什么样子。这是我的尝试:

这些已经被填充并在 main 方法中定义。

ArrayList<String> KEYWORDS = new ArrayList<String>();
ArrayList<String> CUSTOMERS = new ArrayList<String>();
ArrayList<String> SYSTEM_DEPS = new ArrayList<String>();
ArrayList<String> MODULES = new ArrayList<String>();
ArrayList<String> DRIVE_DEFS = new ArrayList<String>();
ArrayList<String> PROCESS_IDS = new ArrayList<String>();

这是我正在使用的逻辑

public void genericForEachLoop(POITextExtractor te) {

        final String[] tagArrays = {"KEYWORDS", "CUSTOMERS", "SYSTEM_DEPS", "MODULES", "DRIVE_DEFS", "PROCESS_IDS"};
        ArrayList<String> al = new ArrayList<String>();

        for(int i=0; i<tagArrays.length; i++) {
            System.out.println(tagArrays[i]);
            al = tagArrays[i];


            for (String item : al) {
                if (te.getText().contains(item)) {
                    System.out.println(item);
                }
            }
        }
    }

我希望 for each 循环每次都不同,例如一旦通过 KEYWORDS,然后通过 CUSTOMERS 等。

【问题讨论】:

  • 你不能从一个字符串到一个列表 ^^ 你应该使用列表>
  • 我想使用 String 给 al 一个实际 ArrayList 的名称,以便它可以用实际名称替换 for(String item : al ),例如关键字。

标签: java arrays arraylist


【解决方案1】:

您不能在 Java 中使用字符串值引用变量。
您尝试做的事情可以通过反射来执行。
但我不鼓励这样做:与“经典”方式相比,它的可读性更低、更脆弱/更容易出错且速度更慢。

作为替代方案,您可以提供List&lt;String&gt;varargs 作为方法的最后一个参数:

public void genericForEachLoop(POITextExtractor te, String[] tagArrays, List<String>... lists ) {

    int i = 0;
    for(List<String> list : lists) {    

        System.out.println(tagArrays[i]);                   
        for (String item : list) {

            if (te.getText().contains(item)) {
                System.out.println(item);
            }

        }

     i++;
    }
}

并以这种方式调用它:

genericForEachLoop(te, 
   new String[]{"KEYWORDS", "CUSTOMERS", "SYSTEM_DEPS", "MODULES", "DRIVE_DEFS", "PROCESS_IDS"},
   KEYWORDS, CUSTOMERS,SYSTEM_DEPS,MODULES,DRIVE_DEFS,PROCESS_IDS);

【讨论】:

  • 类型不匹配无法从元素类型 String 转换为 List
  • 你知道如何解决这个问题吗?
  • @dsafas fsafasfsa 你到底哪里有这个问题?
  • for(List list : lists) {
  • 我认为您在代码中使用的参数类型与在我的示例代码中不同。请检查一下。
【解决方案2】:

我已尝试关注Java 8。下面是您的代码的工作示例,我修改了一些代码。请检查。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainClass {
    public static void main(String... args) {
        String[] strings = {"KEYWORDS", "CUSTOMERS", "SYSTEM_DEPS", "MODULES", "DRIVE_DEFS", "PROCESS_IDS"};
        ArrayList<String> KEYWORDS = new ArrayList<String>();
        KEYWORDS.add("goto");
        ArrayList<String> CUSTOMERS = new ArrayList<String>();
        CUSTOMERS.add("Royal Lotus");
        ArrayList<String> SYSTEM_DEPS = new ArrayList<String>();
        SYSTEM_DEPS.add("MAC BOOK");
        ArrayList<String> MODULES = new ArrayList<String>();
        MODULES.add("TETS MODULE");
        ArrayList<String> DRIVE_DEFS = new ArrayList<String>();
        DRIVE_DEFS.add("TEST DRIVE");
        ArrayList<String> PROCESS_IDS = new ArrayList<String>();
        PROCESS_IDS.add("-15153213");


        Map<String, List<String>> mapOfLists = new HashMap<>();
        mapOfLists.put("KEYWORDS", KEYWORDS);
        mapOfLists.put("CUSTOMERS", CUSTOMERS);
        mapOfLists.put("SYSTEM_DEPS", SYSTEM_DEPS);
        mapOfLists.put("DRIVE_DEFS", DRIVE_DEFS);
        mapOfLists.put("PROCESS_IDS", PROCESS_IDS);
        mapOfLists.put("MODULES", MODULES);
        genericForEachLoop(mapOfLists, strings);
    }


    public static void genericForEachLoop(Map<String, List<String>> mapOfLists, String[] listsToIterate) {
        Arrays.stream(listsToIterate).forEach((listName -> mapOfLists.get(listName).stream().forEach(str -> System.out.println(str))));
    }
}

我已取出 String[] 并将其作为方法的输入提供,以便我可以更改它。只有那些我想迭代的数组才能传递它们。在@Eran 的回答之上进一步构建我正在使用Map&lt;String, List&lt;String&gt; 来存储所有可用的ArrayLists。

请根据您的需要修改代码。我尝试使用来自Java8streamsforeach 方法。

【讨论】:

    【解决方案3】:

    创建 String 数组,您可以创建 ArrayList 的数组,这将帮助您像下面这样动态迭代。

       public static void main(String[] args) 
       {
        ArrayList<String> KEYWORDS = new ArrayList<String>();
        ArrayList<String> CUSTOMERS = new ArrayList<String>();
        ArrayList<String> SYSTEM_DEPS = new ArrayList<String>();
        ArrayList<String> MODULES = new ArrayList<String>();
        ArrayList<String> DRIVE_DEFS = new ArrayList<String>();
        ArrayList<String> PROCESS_IDS = new ArrayList<String>();
    
        final String[] tagNames = {"KEYWORDS", "CUSTOMERS", "SYSTEM_DEPS", "MODULES", "DRIVE_DEFS", "PROCESS_IDS"};
        final List<String> tagNameList=Arrays.asList(tagNames);
        final ArrayList[] tagList = { KEYWORDS, CUSTOMERS, SYSTEM_DEPS, MODULES, DRIVE_DEFS, PROCESS_IDS };
    
        for (ArrayList<String> list : tagList) {
            for(String str :list){
                if(str.contains(""))
                {
    
                }
    
        }
      }
    

    【讨论】:

    • 如果我在我的方法中执行 for 循环,它会告诉我创建一个局部变量 tagArrays。
    猜你喜欢
    • 1970-01-01
    • 2019-01-25
    • 2015-04-23
    • 2012-06-03
    • 2013-01-03
    • 2015-11-28
    • 2023-03-04
    • 1970-01-01
    • 2013-09-23
    相关资源
    最近更新 更多