如何使用Integers填充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]. 

数组是否可以自动更新列/行

任何帮助表示赞赏谢谢

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

比如这样:

 List> twoDim = new ArrayList>(); 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> twoDim = new ArrayList>() {{ 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()); 

并在您执行的特定row上追加另一个元素

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

这是一个更完整的例子:

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

对后续问题的简短回答是

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

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

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

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

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

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

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

您的示例看起来像是要从一对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 neighbours; } 

此外还有列表/数组/这类节点的集合。

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

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

因为它是一个2Darrays,我认为要走的路是:

 List bitArrays = new ArrayList(); 

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

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

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