【问题标题】:how to work with Multidimensional arraylist?如何使用多维数组列表?
【发布时间】:2014-01-18 16:40:34
【问题描述】:

大家好,对不起,我是 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篇)

【问题讨论】:

  • 为什么不创建自己的类,其中有这四个ArrayLists 作为字段?
  • 您可以使用另一个数据结构作为Map&lt;String,List&lt;String&gt;&gt;
  • @t0mppa 似乎是处理列表列表的任务:)
  • 多维集合是一种强烈的代码气味。使用类

标签: java multidimensional-array arraylist bufferedreader


【解决方案1】:

你应该使用另一个数据结构来实现这一点,使用Map&lt;String,List&lt;String&gt;&gt;,其中可能的键是Question,Answers,Category,Essay

然后在你的代码中你可以删除所有不必要的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();
        }
    }
}

你可以看到这种方式更加简洁易读。

【讨论】:

    【解决方案2】:

    创建二维数组后,还需要创建 4 个一维数组。

    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个枚举。

    【讨论】:

      【解决方案3】:

      您可以拥有一个 HashMap,其键为 (Questions,Answers..),ArrayList 为值

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

      【讨论】:

        【解决方案4】:

        看起来像是 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.
                        }
            -- -
            ---
        

        这样最后你就会得到一个包含数据的列表列表。

        【讨论】:

          【解决方案5】:

          这是一个非常糟糕的设计。您应该创建一个自定义类,将不同类型的行作为字段(可能称之为Question),然后使用List&lt;Question&gt; 来存储各个问题对象。这将使其更清晰,更安全,以供将来使用。

          【讨论】:

            【解决方案6】:

            array 是一个由四个元素组成的数组(或者将是,在你设置它之后——见下文)。每个元素都是对另一个ArrayList引用,即ArrayList&lt;String&gt;。要修改内部ArrayList,首先需要获取对它的引用,您可以使用get 方法:

            array.get(0)
            

            对于[0] 列表,或array.get(1) 对于[1] 列表,依此类推。结果将是ArrayList&lt;String&gt;。现在您可以对其执行方法;在ArrayList&lt;String&gt; 末尾添加String

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

            等等。

            其实,现在我看,你需要先设置array的四个元素。每个元素都将设置为new ArrayList&lt;String&gt;

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

            在方法的顶部执行此操作。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-05-17
              • 1970-01-01
              • 2014-11-26
              • 2023-03-17
              • 1970-01-01
              • 2012-04-04
              • 2012-04-27
              • 1970-01-01
              相关资源
              最近更新 更多