【问题标题】:How to display multiple LinkedList elements to look like a table in JAVA?如何显示多个 LinkedList 元素看起来像 JAVA 中的表格?
【发布时间】:2012-12-17 07:12:52
【问题描述】:

我是新人,第一次发帖,如有错误请见谅。我想显示来自 4 LinkedList 的元素以及要像在表格中一样显示的元素。我不需要 JTable,因为我不需要 GUI。我试过使用 ListIterator 但它并没有全部显示:我的意思是如果一个列表有 5 个元素而另一个有 3 个元素,则每个列表中只会显示 3 个元素。 一段代码价值超过一百万字,所以:

    LinkedList list1 = new LinkedList();
    LinkedList list2 = new LinkedList();
    LinkedList list3 = new LinkedList();
    LinkedList list4 = new LinkedList();

    list1.addFirst("A");
    list1.addFirst("B");
    list1.addFirst("C");
    list1.addFirst("D");
    list1.addFirst("E");
    list1.addFirst("F");

    list2.addFirst("G");
    list2.addFirst("H");
    list2.addFirst("I");
    list2.addFirst("J");
    list2.addFirst("K");
    list2.addFirst("L");
    list2.addFirst("M");

    list3.addFirst("N");
    list3.addFirst("O");
    list3.addFirst("P");
    list3.addFirst("Q");
    list3.addFirst("R");
    list3.addFirst("S");
    list3.addFirst("T");
    list3.addFirst("U");

    list4.addFirst("V");
    list4.addFirst("W");
    list4.addFirst("X");
    list4.addFirst("Y");
    list4.addFirst("Z");

    ListIterator it1 = list1.listIterator();
    ListIterator it2 = list2.listIterator();
    ListIterator it3 = list3.listIterator();
    ListIterator it4 = list4.listIterator();

    while (it1.hasNext() && it2.hasNext() && it3.hasNext() && it4.hasNext()){

        System.out.println(it1.next()+"\t\t\t"+ it2.next()+"\t\t\t"+it3.next()+"\t\t\t"+it4.next());
    }

输出是这样的:

我很困惑为什么这是输出,所以如果有人可以解释我做错了什么或者可以给我一个提示或示例,我将不胜感激。这不是作业,我只是一个人学习JAVA。提前谢谢你!

【问题讨论】:

  • 你期望输出是什么?
  • 与问题无关,但是:你为什么使用ListIterator 而不是Iterator
  • 我希望第一个列表是 F E D C B A ,第二个是 M L K J I H G;就像我宣布的那样。
  • 意识到列表将按照创建时的相反顺序输出,因为 addFirst() 总是添加到列表的前面,所以最后添加的元素将是 next() 返回的第一个元素。
  • 是的,因为我想让它表现得像一个堆栈。 Java中的Stack是继承自Vector,所以不是真正的Stack...

标签: java linked-list listiterator


【解决方案1】:

它从头开始打印,因此当您下次打印时(迭代它),您将打印最近添加的项目,因为您每次都在开始添加项目)

用这条线

while (it1.hasNext() && it2.hasNext() && it3.hasNext() && it4.hasNext()){

您也仅在所有列表都有下一个值时才打印,仅打印 5 个值,因为您的最短列表的大小仅为 5(列表 4)

【讨论】:

【解决方案2】:

您正在使用 &&,所以当迭代器的 hasNext() 返回 false 时,(it1.hasNext() && it2.hasNext() && it3.hasNext() && it4.hasNext()) 的整个评估将是 false。

【讨论】:

    【解决方案3】:

    您看不到带有A 的行的原因是因为这一行:

    it1.hasNext() && it2.hasNext() && it3.hasNext() && it4.hasNext()
    

    一旦你的列表中的一个元素用完了,你就会停下来。

    要修复它,您必须继续工作,直到您的所有列表都没有元素为止。但是,如果它们没有元素,您不能只访问这些列表,因此您必须解决它。

    // change && to ||
    while(it1.hasNext() || it2.hasNext() || it3.hasNext() || it4.hasNext()) {
        Object[] objs = new String[] { "", "", "", ""}; // empty strings
        // if iterators on this row are not empty, replace with values
        if(it1.hasNext()) objs[0] = it1.next();
        if(it2.hasNext()) objs[1] = it2.next();
        if(it3.hasNext()) objs[2] = it3.next();
        if(it4.hasNext()) objs[3] = it4.next();
        // now print
        String tabs = "\t\t\t";
        System.out.println(objs[0] + tabs + objs[1] + tabs + objs[2] + tabs + objs[3]);
    
    }
    

    如果没有数组,这会更快,而是使用严格数量的对象。但我认为如果我们将其保留为数组,它会更简洁、更容易重构。

    【讨论】:

    • 非常感谢 corsiKa。一个非常简单和聪明的方法来解决它。你是最棒的!
    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    • 2017-09-18
    • 2014-08-22
    相关资源
    最近更新 更多