我必须创建一个大小未知的二维数组。所以我决定使用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].
阵列可以自动为我更新列/行
感谢任何帮助
答案 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);
}
}