尝试从具有固定行大小和可变列大小的ArrayList读取元素时出现意外输出?

时间:2016-07-14 12:05:13

标签: java arraylist

1)我无法读取Column Wise列表中的元素,因为Column的大小是可变的。

2)我有10个数据库,并将这10个数据库信息中的每一个存储在一个列表中。数据库中的每个列表都可以有可变长度。

拥有可变数据。

我可以在列表中插入元素。但我无法读取Column Wise列表中的元素,但行是固定的。

例如:让我们说元素可以是任何元素。

1 2 3

1 2 3 4 5

1 2

1 2 4

我需要输出为1,1,1,1,2,2,2,2,3,3,4,5,5

  

任何人都可以指导我如何获得?

MyUnderstanding

我尝试了以下方法并像这样编码

我 mycode的:

    int ar[][] = new int[10][]; //Created a 2Dimensional Array
    //The Size of the row is fixed but not for Columns(as it is variable)

    ArrayList<Object> al = new ArrayList<Object>(); 

    ArrayList<<Object> al1 = new ArrayList<Object>();

    ArrayList<Object> al4 = new ArrayList<Object>();

    for (int j = 0; j < ar.length; j++) //This loop is for generating each database

       {
        System.out.println("Enter the Size of the list" + j);
        String s1 = sc.next();
        int i = Integer.parseInt(s1);
        for (int k = 0; k < i; k++)  //This loop is for generating the elements size inside each database
{
            System.out.println("Enter the Elements of the list" + j);
            String s2 = sc.next();
            al1.add(s2); //I store these elements in a list
            ar[i] = new int[al1.size()];
            al.add(al1);    //Finally store a list in a SeperateList

        }

    }



    System.out.println("Reading each elements of the ArrayList");

主要问题

    ListIterator ltr = al.listIterator(); // Used ListIterator to extract
                                            // each
                                            // List from the 10 list.

    for (int i = 0; i < 10; i++)

    {
        for (int l = 0; l < ar[i].length; l++) 
        {
            while (ltr.hasNext()) // A list AL having 10 Databases.
            {
                ArrayList a0to9 = (ArrayList) ltr.next();// I have taken 1 listfrom the 10 Databases.
                ListIterator ltr1 = a0to9.listIterator(); // Used ListIterator to extract each Element from the List.

                while (ltr1.hasNext()) // If the first List contains the elements (the elements are stored in the form of list)
                {
                    ArrayList elements = (ArrayList) ltr1.next(); // If the list has elements we can extract that Object
                    al4.add(elements); //And store the elements in another list
                    break;
                }

            }
        }
    }   

但是我得到了下面的输出

Output:

Exception in thread "main" java.lang.NullPointerException
at LockWaitTimeoutTest.main(LockTest.java:48)
  

任何人都可以指导我如何解决这个问题。

提前谢谢:)

2 个答案:

答案 0 :(得分:0)

开始时要做的几件事:

for (int j = 0; j < ar.length; j++)

{
    System.out.println("Enter the Size of the list" + j);
    String s1 = sc.next();
    int i = Integer.parseInt(s1);
    for (int k = 0; k < i; k++) {
        System.out.println("Enter the Elements of the list" + j);
        String s2 = sc.next();
        al1.add(s2);
        ar[i] = new int[al1.size()];
        al.add(al1);

    }

}
  • 您永远不会在al1周期内分配for,因此它最终会包含Enter the Elements of the list提示的每个答案
  • 您永远不会在al1周期内分配for,因此al列表中的每个项目都会指向相同的列表
  • 在写入数组时不使用索引j,因此对ar的赋值将始终覆盖先前外循环迭代中的值
  • 由于在每次内部迭代中总是向al1追加一个新元素,al1.size()将在每次内部迭代中增长1

答案 1 :(得分:0)

首先,您不应该使用raw types。您应该准确指定列表要保留的类型。相反,您可以插入所有元素(Object),如果插入的元素类型超出预期,可能不会注意到。

这也是你的问题所在。 al的真实结构是ArrayList<ArrayList<String>>。由于您使用alal.add(al1);添加了列表。 al1ArrayList<String>,因为您在String添加了al1.add(s2);

到目前为止一切顺利,问题出在哪里?处理时,您希望al1保留ArrayList而不是String

al.listIterator() --> (ArrayList) ltr.next() // ltr iterates over al
a0to9.listIterator() --> (ArrayList) ltr1.next(); // ltr1 iterates over al1

下次你应该使用泛型而不是原始类型,这样你就可以立即获得CompileError并确切地看到问题所在:)

另一方面,您可能更容易使用extended-for-loop而不是ListIterator。它是如何工作的?这是一个例子:

List<Element> list = ...;
...
for (Element element : list) {
    System.out.println(element);
}

如果您需要索引,可以这样做:

ArrayList<Element> list = ...;
...
for (int i = 0; i < list.size(); i++) {
    System.out.println("Index: " + i + ", Element: " + list.get(i));
}

但请注意,如果List具有缓慢的直接访问权限,则速度非常慢。 ArrayList具有快速直接访问权限,因为它知道哪些元素在给定索引处。对于LinkedList,您应该使用Iterator,因为它没有直接访问权限。

总结:请勿使用raw types之类的ArrayList myList,而应使用ArrayList<String> myList之类的泛型。那么下次调试这些东西时你就不会有问题了。