【问题标题】:How to fill a two Dimensional ArrayList in java with Integers?java - 如何用整数填充Java中的二维ArrayList?
【发布时间】:2011-06-28 17:06:50
【问题描述】:

我必须创建一个大小未知的二维数组。所以我决定使用 2d ArrayList 问题是我不确定如何初始化这样的数组或存储信息。

假设我有以下数据

   0 connects 1
   2 connects 3 
   4 connects 5

....等到大量的随机连接

我想插入

true(1) into [0][1], 
true(1) into [2][3], 
true(1) into [4][5]. 

数组可以自动为我更新列/行吗

感谢任何帮助

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    我不确定如何初始化这样的数组或存储信息。

    例如这样:

    List<List<Integer>> twoDim = new ArrayList<List<Integer>>();
    
    twoDim.add(Arrays.asList(0, 1, 0, 1, 0));
    twoDim.add(Arrays.asList(0, 1, 1, 0, 1));
    twoDim.add(Arrays.asList(0, 0, 0, 1, 0));
    

    如果你愿意,也可以这样:

    List<List<Integer>> twoDim = new ArrayList<List<Integer>>() {{
        add(Arrays.asList(0, 1, 0, 1, 0));
        add(Arrays.asList(0, 1, 1, 0, 1));
        add(Arrays.asList(0, 0, 0, 1, 0));
    }};
    

    要插入新行,您可以这样做

    twoDim.add(new ArrayList<Integer>());
    

    并在特定的row 上附加另一个元素

    twoDim.get(row).add(someValue);
    

    这是一个更完整的例子:

    import java.util.*;
    
    public class Test {
    
        public static void main(String[] args) {
    
            List<List<Integer>> twoDim = new ArrayList<List<Integer>>();
    
            String[] inputLines = { "0 1 0 1 0", "0 1 1 0 1", "0 0 0 1 0" };
    
            for (String line : inputLines) {
                List<Integer> row = new ArrayList<Integer>();
    
                Scanner s = new Scanner(line);
                while (s.hasNextInt())
                    row.add(s.nextInt());
    
                twoDim.add(row);
            }
        }
    }
    

    【讨论】:

    • 我需要按列指定特定的行。如何在这个arrayList的[0][1]、[0][2]等中插入一个数字?
    • @eNetik,设置一个特定的值你会toDim.get(x).set(y, value); 但是,假设你已经构建了空数组。您必须以类似于最初的代码的方式构造数组(即使您只是将所有值设置为零),以便更新有要更新的内容。
    • @eNetik,添加了一个更完整的例子。
    • @Edwin Buck,我不知道数组大小。它是一个文件读取,我需要根据连接的节点创建一个邻接矩阵。所以我需要从开始的array[0][1] = 1 开始设置。随着文件继续读取,我需要继续这个过程。我想知道 arrayList 在我添加后是否自行构建它的行/列项目到它
    • 不,如果您尝试在特定索引处输入值,ArrayLists 不会“用零填充”或类似的东西。您可以在中间追加和更新值,但不能“在任意索引处添加值”。
    【解决方案2】:
    List<List<Integer>> array = new ArrayList<List<Integer>>();
    // add row:
    array.add( new ArrayList<Integer>() );
    // add a column:
    array.get( array.size() -1 ).add( 1 );
    

    工作演示:

    import java.util.*;
    import static java.lang.System.out;
    class Load { 
        public static void main( String ... args ) { 
    
            List<List<Integer>> array = new ArrayList<List<Integer>>();
    
            Scanner input = new Scanner(System.in);
            out.println("Enter n:");
            int n = input.nextInt();
    
            out.println("Enter m:");
            int m = input.nextInt();
    
            out.println("Enter the values:");
    
            for( int i = 0 ; i < n ; i++ ) { 
                // add row:
                List<Integer> list = new ArrayList<Integer>();
                array.add( list );
                for( int j = 0 ; j < m ; j++ ) { 
                    // add a column:
                    // array.get( array.size() -1 ).add( 1 ); or
                    list.add( input.nextInt() );
                }
            }
            out.println("Result:");
            out.println( array );
    
        }
    }
    

    输出:

    C:\>java Load
    Enter n:
    3
    Enter m:
    6
    Enter the values
    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
    Result:
    [[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17]]
    

    【讨论】:

      【解决方案3】:

      后续问题的简短回答是

      array.get(i1).put(i2, value);
      

      但如果 ArrayList 的大小

      putCell(getRow(array, i1), i2, value)
      

      其中getRow()知道如何增长ArrayList的ArrayList,而putCell()知道如何增长ArrayList。

      【讨论】:

        【解决方案4】:

        如果您没有提前获得所有数据来利用 aioobe 的解决方案,您可以使用 Google 的 Guava 库中的表格。

        Table<Integer,Integer,Integer> matrix = new HashBasedTable<Integer,Integer,Integer>();
        matrix.put(rowIndex,columnIndex,value);
        

        这样做的主要缺点是,如果您处理大量数据,它的速度或内存效率都不是特别高,因为一切都是哈希查找,而基元由 Integer 包装。

        【讨论】:

        • 我不认为我被允许使用外部库:(。我正在处理 .java 文件
        【解决方案5】:

        您的示例看起来像您想要一个从整数对到布尔值的映射(默认值为 false)。如果这是一个稀疏映射(即实际上大多数位置都是错误的),那么使用 HashSet 或类似的东西可能会更好(作为一个封装两个 int 的类,具有适当的 hashCode 和 equals 实现)。

        class IntPair {
           int first;
           int second;
           public boolean equals(Object o) {
              return o instanceof IntPair &&
                 ((IntPair)o).first == first &&
                 ((IntPair)o).second == second;
           }
           /** optimized for small numbers */
           public int hashCode() {
               return first + second * 44729;
           }
           public String toString() {
             return "(" + first + ", " + second + ")";
           }
        }
        

        然后,要说“0 连接 1”,你会写

        set.add(new IntPair(0,1));
        

        这真的取决于你之后想要使用什么操作——这样的 HashSet 具有快速查找和更改并且不会占用太多空间,但你无法快速获得“节点 1 的所有邻居”。如果你需要这样的访问,你可能只需要一个类似的类

        class Node {
           int id;
           Set<Node> neighbours;
        }
        

        还有一个列表/数组/此类节点的集合。

        “未知大小的数组”这个问题不够具体,无法真正胜任回答。

        【讨论】:

          【解决方案6】:

          由于您只需要在该二维数组中存储布尔值,我会说最合适的数据结构(作为内存消耗和有用的接口)是java.util.BitSet,它基本上是一个模拟位数组的类:

          因为它是一个二维数组,我认为要走的路是:

          List<BitSet> bitArrays = new ArrayList<BitSet>();
          

          在列表中,您不能只说:“这是第 5 个元素”而不插入前 4 个元素。但在BitSet 中,您可以简单地set() 任何您需要的位,它会自动扩展到所需的大小。

          【讨论】:

            【解决方案7】:

            好吧,如果您知道您有 3 行和 5 列(如您的数据示例所示),您可以按如下方式对其进行初始化:

            int[][] a = new int[3][5]; 
            

            但是,如果行数发生变化,您可以执行以下操作:

            String dataStr = "0,1,0,1,0:0,1,1,0,1:0,0,0,1,0";
            
            String[] rows = dataStr.split(":");
            
            String[] cols = rows[0].split(",");
            

            现在可以初始化了:

            int[][] a = new int[rows.length][cols.length];
            

            这将适应更改行和列的大小。可能不是最优雅的方法,但应该可以。

            【讨论】:

              【解决方案8】:
                import java.util.*;
                  public class ArrayListDS { 
                      public static void main( String [] args ) { 
              
                      ArrayList<ArrayList<Integer>> row = new ArrayList<ArrayList<Integer>>();
              
                         Scanner sc = new Scanner(System.in);
              
                         System.out.println("Enter the number of row: ");
                         int n = sc.nextInt();
              
                         for(int i = 0; i < n; i++){
              
                             ArrayList<Integer> col = new ArrayList<Integer>();
                             row.add(col);
              
                         System.out.println("Enter the number of column: ");
                         int m = sc.nextInt();
              
                             for(int j = 0; j < m; j++){
                                  col.add(sc.nextInt()); 
                             }
                             System.out.println();
                         }
                         System.out.println(row);
                      }
                  }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-08-13
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多