【问题标题】:Print values of a 2D ArrayList Matrix打印二维 ArrayList 矩阵的值
【发布时间】:2015-11-29 07:50:15
【问题描述】:

我有一个像 2D Arraylist 矩阵

    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 行中。 如何打印 arraylist 矩阵的值? 谁能给我一个方法??

【问题讨论】:

  • 您的意思是table[0][1].add(10) 中没有错误?考虑到它还没有被初始化,那就奇怪了。
  • @KumarSaurabh 声明是正确的。 get() 方法的唯一问题
  • @sᴜʀᴇsʜᴀᴛᴛᴀ 实际上,Kumar 可能在这里解决了真正的问题。似乎 OP 认为他有一个 10x10 2D 数字列表,而不是 10x10 数字列表数组(实际上是原始列表......)
  • @RealSkeptic 不。下流混乱。在一个地方添加并访问另一个地方。看我的回答。

标签: java arraylist


【解决方案1】:

您似乎认为您有一个二维数字矩阵,存储为ArrayList。那根本不是你所拥有的。相反,您有一个二维矩阵,其中每个元素都是一个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 列。

嵌套数组列表

如果您想使用 ArrayList 而不是数组,那很好。你只需要意识到ArrayList实际上将包含其他ArrayLists,每个Numbers都将包含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));

在此示例中,您首先声明一个包含ArrayListsArrayList,其中包含Numbers,并初始化外部ArrayList。然后你创建一些内部ArrayLists,最后给它们每个Numbers

总结

您可以根据需要使用数组或ArrayLists。您只需在访问它们的元素之前正确初始化它们。如何初始化取决于您选择的数据结构。

所有代码

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

【讨论】:

    【解决方案2】:

    实际的例外是在行

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

    您在 0,0 位置添加元素并尝试在 0,1 位置添加 arraylist 元素。

    因此是空指针。

    试试

    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] 中获取值
    • @Suresh 我尝试同时使用索引和 get(1).get(0) 但它仍然给出空指针异常
    • @vineethPrabhakaran 等等.. 看看table[0][0] = new ArrayList(); table[0][0].add(10); 和 indeces 的行。我更改了您的代码并进行了更新。请运行并查看差异。
    【解决方案3】:

    要使用ArrayList,您必须首先在尖括号中声明ArrayList 的类型。尝试使用如下代码 sn-p:

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

    【讨论】:

      【解决方案4】:

      如果您正在寻找的不仅仅是玩具项目,您应该认真考虑使用一些外部矩阵库。数组维护起来会很痛苦。

      我可以推荐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));
      

      此外,您很可能必须在矩阵中进行一些计算。库将对基本的提供一些支持,并会为您节省一些时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-10
        • 2021-11-20
        • 2021-12-25
        • 2012-10-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多