打印一个二维ArrayList矩阵的值

4

I have a 2D Arraylist matrix like

    ArrayList[][] table = new ArrayList[10][10];
    table[0][0] = new ArrayList(); 
    table[0][1].add(10); 
    table[1][0].add(20); 
    table[1][1].add(30); 

    System.out.println("Value="+table[1][0].get()); //error line

错误发生在 System.out.println 行。 我该如何打印数组列表矩阵的值?? 有人能建议一个方法吗?


1
https://dev59.com/7W855IYBdhLWcg3wViu3 - Kumar Saurabh
2
你的意思是在 table[0][1].add(10) 没有出现错误吗?考虑到它还没有被初始化,那就很奇怪了。 - RealSkeptic
@KumarSaurabh 声明是正确的。只有 get() 方法存在问题。 - Suresh Atta
@sᴜʀᴇsʜᴀᴛᴛᴀ 实际上,库马尔可能发现了真正的问题。OP似乎认为他有一个10x10的二维数字列表,而不是一个10x10的数字列表数组(实际上,是原始列表...)。 - RealSkeptic
@RealSkeptic 不是的。这是由于索引混淆导致的。数据被添加到一个位置,而在另一个位置进行访问。请看我的回答。 - Suresh Atta
@vineeth,请问你用数组尝试代表这两种结构中的哪一个?(链接:http://i.imgur.com/Gs2nI7B.png) - RealSkeptic
4个回答

1
实际的异常出现在这些行:

table[0][0] = new ArrayList(); 
  table[0][1].add(10); 

你正在将元素添加到0,0位置,并尝试将arraylist元素添加到0,1位置。
因此出现了空指针异常。
尝试:
public static void main(String[] args) {
        ArrayList[][] table = new ArrayList[10][10];
        table[0][0] = new ArrayList(); 
        table[0][0].add(10); 
        table[0][0].add(20); 
        table[0][0].add(30); 

        System.out.println("Value="+table[0][0].get(1)); 
    }

我尝试使用1和0,但是我得到了空指针异常。我不知道如何从table[1][0]中获取值。 - vineeth
@Suresh 我尝试使用索引和get(1).get(0)两种方法,但仍然出现空指针异常。 - vineeth
@vineethPrabhakaran 等一下..看看这些代码 table[0][0] = new ArrayList(); table[0][0].add(10); 和索引。我修改了你的代码并进行了更新。请运行并查看差异。 - Suresh Atta

1

使用ArrayList时,必须首先在尖括号内声明ArrayList的类型。尝试使用以下代码片段:

    ArrayList<ArrayList<Integer>> table = new ArrayList<ArrayList<Integer>>(); //2d ArrayList
    ArrayList<Integer> x = new ArrayList<Integer>(); 
    x.add(10);
    x.add(20);
    table.add(x); 
    table.add(x); 

    System.out.println("Value="+table); //Prints table[][]
    System.out.println("Value="+table.get(0)); //Prints table[0]
    System.out.println("Value="+table.get(0).get(1)); //Prints table [0][1]

要插入新行,必须执行以下操作:
table.add(new ArrayList<Integer>());

如果您想在特定行上添加另一个元素,您需要执行以下操作:

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

1
如果您正在寻找不仅仅是玩具项目的东西,您应该认真考虑使用一些外部矩阵库。使用数组会在维护方面很麻烦。
我可以推荐EJML。使用这个库,您的代码将如下所示:
BlockMatrix64F matrix = new BlockMatrix64F(10, 10); 
matrix.set(0,1,10);
matrix.set(1,0,20);
matrix.set(1,1,30);

System.out.println("Value="+matrix.get(1,0));

此外,很可能你需要在矩阵内进行一些计算。库将提供一些基本的支持,并节省你一些时间。

1
你似乎认为你有一个存储为ArrayList的数字2D矩阵,但事实并非如此。相反,你有一个2D矩阵,其中每个元素都是ArrayList。这意味着你的代码中实际上有3个维度。我认为这不是你想要的。有几种方法可以使用你已经拥有的结构(即不使用任何外部库)来实现二维。

一个由数字组成的二维数组

数组是一个易于理解的结构,所以让我们从那里开始。

Number[][] table = new Number[10][10];
table[0][0] = 0; 
table[0][1] = 10; 
table[1][0] = 20; 
table[1][1] = 30; 
System.out.println("Value="+table[1][0].get());

这段代码声明了一个类型为Number的二维数组,然后用10行10列进行初始化。它部分填充了数字。只要访问已经初始化的元素,就不会有问题。尝试访问尚未初始化的元素(如table[3][4])将是错误的。

初始化数组的另一种方法

Number[][] table = { { 0, 10 }, { 20, 30 } };
System.out.println("Value=" + table[1][0]);

这与之前的相同,但一次性初始化。这个特定的数组只有2行2列。

嵌套的ArrayLists

如果你想使用一个ArrayList代替数组,那没问题。你只需要意识到ArrayList实际上会包含其他ArrayList,每个ArrayList都包含Numbers。就像这样:
ArrayList<ArrayList<Number>> table = new ArrayList<>();
table.add(new ArrayList<>());
table.add(new ArrayList<>());
table.get(0).add(0);
table.get(0).add(10);
table.get(1).add(20);
table.get(1).add(30);
System.out.println("Value=" + table.get(1).get(0));

在这个例子中,你首先声明一个包含包含数字的ArrayList的ArrayList,并初始化外部ArrayList。然后创建一些内部ArrayList,最后为每个内部ArrayList分配一些数字。
总结:
您可以根据自己的喜好使用数组或ArrayList。在访问它们的元素之前,您只需要正确地初始化它们即可。如何初始化取决于您选择的数据结构。
所有代码:
import java.util.ArrayList;
public class TwoD {
  public void example1() {
    Number[][] table = new Number[10][10];
    table[0][0] = 0;
    table[0][1] = 10;
    table[1][0] = 20;
    table[1][1] = 30;

    System.out.println("\nExample 1");
    System.out.println("Value=" + table[1][0]);
  }

  public void example2() {
    Number[][] table = { { 0, 10 }, { 20, 30 } };

    System.out.println("\nExample 2");
    System.out.println("Value=" + table[1][0]);
  }

  public void example3() {
    ArrayList<ArrayList<Number>> table = new ArrayList<>();
    table.add(new ArrayList<>());
    table.add(new ArrayList<>());
    table.get(0).add(0);
    table.get(0).add(10);
    table.get(1).add(20);
    table.get(1).add(30);

    System.out.println("\nExample 3");
    System.out.println("Value=" + table.get(1).get(0));
  }

  public static void main(String[] args) {
    TwoD me = new TwoD();
    me.example1();
    me.example2();
    me.example3();
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接