繁体   English   中英

如何使用多维arraylist?

[英]how to work with Multidimensional arraylist?

嘿,对不起,我是Java的新手,但我想做点什么,我需要一个多维数组列表。 必须将其实现为以下代码:

public static void OpenFile() {
 ArrayList<ArrayList<String>> array = new ArrayList<ArrayList<String>>();
    int retrival = chooser.showOpenDialog(null);
    if (retrival == JFileChooser.APPROVE_OPTION) {
        try (BufferedReader br = new BufferedReader(new FileReader(
                chooser.getSelectedFile()))) {
            String sCurrentLine;
            while ((sCurrentLine = br.readLine()) != null) {
                if (sCurrentLine.equals("")) {
                    continue;
                } else if (sCurrentLine.startsWith("Question")) {
                    System.out.println(sCurrentLine.split(":")[1]);
                    //add to [0] in array ArrayList
                } else if (sCurrentLine.startsWith("Answer")) {
                    System.out.println(sCurrentLine.split(":")[1]);
                    //add to [1] in array ArrayList
                } else if (sCurrentLine.startsWith("Category")) {
                    System.out.println(sCurrentLine.split(":")[1]);
                    //add to [2] in array ArrayList
                } else if (sCurrentLine.startsWith("Essay")) {
                    System.out.println(sCurrentLine.split(":")[1]);
                    //add to [3] in array ArrayList
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

我拆分的所有字符串[1]索引都需要按以下顺序放入多维数组:问题,答案,类别和论文。
所以我目前正在使用普通的多维数组,但是您不能轻松更改其值。 我希望我的多维数组列表看起来像这样:

多维数组列表

  • [0]:问题(可能超过100个。)
  • [1]个答案(可能超过100个。)
  • [2]类别(可能超过100个。)
  • [3]文章(可能超过100篇。)

似乎是使用List of List进行的分配。

这是伪代码。 尝试实现休息。

 ArrayList<ArrayList<String>> array = new ArrayList<ArrayList<String>>();

您要做的第一件事是获取4个新鲜的ArrayLists

 ArrayList<String> qtns= new ArrayList<String>>();
 ArrayList<String> answrs= new ArrayList<String>>();
--
--

将它们全部添加到主列表

array.add(qtns);
--
--

然后像

     else if (sCurrentLine.startsWith("Question")) {
                        System.out.println(sCurrentLine.split(":")[1]);
                        //add to [0] in array ArrayList
                        array.get(0).add(sCurrentLine.split(":")[1]);//get first list(which is qtns list) and add to it.
     } else if (sCurrentLine.startsWith("Answer")) {
                    System.out.println(sCurrentLine.split(":")[1]);
                    //add to [1] in array ArrayList
 array.get(1).add(sCurrentLine.split(":")[1]);//get second list(which is answers list) and add to it.
                }
    -- -
    ---

这样一来,您最终将获得一个包含数据的列表列表。

array是由四个元素组成的数组(或者在设置后将成为-见下文)。 每个元素都是对另一个ArrayList引用 ,即ArrayList<String> 要修改内部ArrayList ,首先需要获取对它的引用,这需要使用get方法进行:

array.get(0)

用于[0]列表,或array.get(1)用于[1]列表,依此类推。 结果将是ArrayList<String> 现在您可以对此执行方法; 将一个String添加到ArrayList<String>的末尾:

array.get(0).add("String to add");

等等

实际上,现在我来看了,您需要首先设置array的四个元素。 每个元素将被设置为一个new ArrayList<String>

for (int i = 0; i < 4; i++)
    array.add(new ArrayList<String>());

在方法顶部执行此操作。

这是一个非常糟糕的设计。 您应该创建一个自定义类,将不同类型的行作为字段(也许称为Question ),然后使用List<Question>来存储单个问题对象。 这样可以使以后的工作更加清晰, 安全

您应该使用另一个数据结构来实现这一点,请使用Map<String,List<String>> ,其中可能的键是QuestionAnswersCategoryEssay

然后,您可以在代码中删除所有不必要的if-else

您的代码示例:

public static void openFile() {
    Map<String,List<String>> map = new HashMap<>();
    // here you put the keys, you can do it when you read the file based in your input too dynamically
    map.put("Question",new ArrayList<>());
    map.put("Answers",new ArrayList<>());
    map.put("Category",new ArrayList<>());
    map.put("Essay",new ArrayList<>());
    int retrival = chooser.showOpenDialog(null);
    String[]array = null;
    if (retrival == JFileChooser.APPROVE_OPTION) {
        try (BufferedReader br = new BufferedReader(new FileReader(
                chooser.getSelectedFile()))) {
            String sCurrentLine;
            while ((sCurrentLine = br.readLine()) != null) {
                if (sCurrentLine.equals("")) {
                    continue;
                }

               array = sCurrentLine.split(":");
               if(map.containsKey(array[0])){
                  map.get(array[0]).add(array[1]);
               }   
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

您可以看到这种方式更加清晰易读。

您可以使用键为(Questions,Answers ..)和ArrayList为值的HashMap

HashMap <String,ArrayList<String>> array = new HashMap<String,ArrayList<String>>();


 if(array.containsKey("Question")){
         array.get("Question").add(sCurrentLine.split(":")[1]);
  }else{
          ArrayList<String> questions = new ArrayList<String>();
          questions.add(sCurrentLine.split(":")[1]);
          array.put("Question",questions );
 }

在您的代码中进行修改

public static void OpenFile() {
        HashMap <String,ArrayList<String>> array = new HashMap<String,ArrayList<String>>();
        int retrival = chooser.showOpenDialog(null);
        if (retrival == JFileChooser.APPROVE_OPTION) {
            try (BufferedReader br = new BufferedReader(new FileReader(
                    chooser.getSelectedFile()))) {
                String sCurrentLine;
                while ((sCurrentLine = br.readLine()) != null) {
                    if (sCurrentLine.equals("")) {
                        continue;
                    } else if (sCurrentLine.startsWith("Question")) {
                        System.out.println(sCurrentLine.split(":")[1]);
                        if(array.containsKey("Question")){
                            array.get("Question").add(sCurrentLine.split(":")[1]);
                        }else{
                            ArrayList<String> questions = new ArrayList<String>();
                            questions.add(sCurrentLine.split(":")[1]);
                            array.put("Question",questions );
                        }
                        //add to [0] in array ArrayList
                    } else if (sCurrentLine.startsWith("Answer")) {
                        System.out.println(sCurrentLine.split(":")[1]);
                        //add to [1] in array ArrayList
                        //Do the same as above if condition with Answer as Key
                    } else if (sCurrentLine.startsWith("Category")) {
                        System.out.println(sCurrentLine.split(":")[1]);
                        //add to [2] in array ArrayList
                    } else if (sCurrentLine.startsWith("Essay")) {
                        System.out.println(sCurrentLine.split(":")[1]);
                        //add to [3] in array ArrayList
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

创建2D阵列后,还需要创建4个1D阵列。

ArrayList<ArrayList<String>> array = new ArrayList<ArrayList<String>>();
// 1D array for "Question"
array.add(new ArrayList<String>());
// 1D array for "Answer"
array.add(new ArrayList<String>());
// 1D array for "Category"
array.add(new ArrayList<String>());
// 1D array for "Essay"
array.add(new ArrayList<String>());

假设如果您需要向问题数组中添加一项,则应该这样做:

array.get(i).add(...);

其中i =0。i的范围是0到3,对应于4个枚举。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM