如何使用Integers填充java中的二维ArrayList?

时间:2011-02-16 22:17:46

标签: java arraylist

我必须创建一个大小未知的二维数组。所以我决定使用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]. 

阵列可以自动为我更新列/行

感谢任何帮助

8 个答案:

答案 0 :(得分:18)

  

我不确定如何初始化此类数组或存储信息。

比如说:

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

答案 1 :(得分:15)

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]]

答案 2 :(得分:0)

后续问题的简短回答是

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

但是如果ArrayList的大小是&lt; =索引,则get和put都可能失败。因此,如果您希望能够填充任意值,则需要编写方法以根据需要进行扩展。这个电话就像是

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

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

答案 3 :(得分:0)

如果您没有事先获得所有数据以便能够利用aioobe的解决方案,那么您可以使用Google的Guava库中的表格。

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

这样做的主要缺点是,如果您处理大量数据,它的速度和速度都不是非常快,因为所有内容都是哈希查找,而原语由Integer包装。

答案 4 :(得分:0)

好吧,如果你知道你有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];

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

答案 5 :(得分:0)

您的示例看起来像是要从一对int到booleans的映射(默认值为false)。如果这是一个稀疏映射(即实际上大多数位置都是假的),你可能会更喜欢HashSet或类似的东西(使用hashCode和equals的合适实现封装两个int的类)。

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 :(得分:0)

由于你只需要在那个2D数组中存储布尔值,我会说最合适的数据结构(因为内存消耗和有用的接口)都是java.util.BitSet,这基本上是一个模拟一点的类阵列:

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

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

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

答案 7 :(得分:0)

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