Как отобразить несколько элементов LinkedList, чтобы они выглядели как таблица в JAVA?

Я здесь новенькая и пишу впервые, так что извините, если допущу ошибки. Я хочу отображать элементы из 4 LinkedList, и эти элементы должны отображаться как в таблице. Мне не нужен JTable, потому что мне не нужен графический интерфейс. Я пробовал с 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());
    }

И вывод такой:

http://imageshack.us/photo/my-images/9/capturelkt.png/

Я смущен, почему это вывод, поэтому, если кто-то может объяснить мне, что я делаю неправильно, или может дать мне подсказку или пример, я буду благодарен. Это не домашнее задание, я просто изучаю JAVA в одиночку. Заранее спасибо !


person Survivor    schedule 02.01.2013    source источник
comment
Что вы ожидаете на выходе?   -  person Aaron Kurtzhals    schedule 03.01.2013
comment
Ничего общего с вопросом, но: почему вы используете ListIterator вместо Iterator?   -  person MrSmith42    schedule 03.01.2013
comment
Я ожидаю, что первый список будет F E D C B A , второй M L K J I H G; так же, как я их объявил.   -  person Survivor    schedule 03.01.2013
comment
Имейте в виду, что списки будут выводиться в порядке, обратном порядку создания, потому что addFirst() всегда добавляет в начало списка, поэтому последний добавленный элемент будет первым, который будет возвращен next().   -  person mikeslattery    schedule 03.01.2013
comment
да, потому что я хотел, чтобы он вел себя как стек. Стек из Java унаследован от Вектора, так что это не настоящий стек...   -  person Survivor    schedule 03.01.2013
comment
@Survivor, почему наследование от Vector не может быть настоящим стеком? Стек касается поведения, а не реализации. java.util.Stack — это настоящий стек, даже если он реализован с использованием обычно ненужного механизма синхронизации.   -  person corsiKa    schedule 03.01.2013
comment
@Survivor Как это не настоящий стек?   -  person hd1    schedule 03.01.2013
comment
Ну, например, если вы добавите 1,2,3,4,5 в контейнер стека Java, у вас будет 1, 2, 3, 4, 5 вместо 5, 4, 3, 2, 1. Вот что я имел ввиду; Иногда я путаюсь, поэтому я сделал LinkedList таким образом.   -  person Survivor    schedule 03.01.2013


Ответы (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]);

}

Это было бы быстрее без массива, а вместо этого использовалось строгое количество объектов. Но я считаю, что это будет чище и проще для рефакторинга, если мы оставим его в виде массива.

person corsiKa    schedule 02.01.2013
comment
Спасибо большое КорсиКа. Очень простой и умный способ решить эту проблему. Ты лучший ! - person Survivor; 03.01.2013

он печатается с самого начала, поэтому, когда вы печатаете следующий (итерируя его), вы печатаете последний добавленный элемент, потому что вы каждый раз добавляете элементы в начало)

с этой строкой

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

вы также печатаете только в том случае, если все списки имеют следующее значение, печатаются только 5 значений, потому что ваш самый короткий список имеет размер только 5 (список 4)

person Sean F    schedule 02.01.2013
comment
Спасибо, Шон, ты прав; Теперь я понимаю. Затем можно распечатать эти списки следующим образом: imageshack.us/photo/ my-images/96/capturedwz.png (извините, я не художник по рисованию). - person Survivor; 03.01.2013

Вы используете &&, поэтому в тот момент, когда hasNext() итератора возвращает false, вся оценка (it1.hasNext() && it2.hasNext() && it3.hasNext() && it4.hasNext()) будет ложной.

person Foggzie    schedule 02.01.2013