Печать содержимого Java ArrayList построчно в консоль - PullRequest
4 голосов
/ 07 января 2012

Я очень новичок в программировании на Java, и это на самом деле часть проблемы, которую мне нужно решить для домашней работы: я читаю содержимое файла построчно в виде String в ArrayList для последующей обработки. Мне нужно, чтобы программа распечатывала содержимое консоли ArrayList на отдельных строках, но вывод после запуска скомпилированного файла печатает первую строку файла, затем печатает первую и вторую строки вместе на следующей строке, а затем печатает первая, вторая и третья строчки программы.

Мое понимание того, как это должно работать, заключается в том, что программа возьмет мой файл, FileReader и BufferedReader будут извлекать строки текста в файле в виде строк, которые затем помещаются в ArrayList с каждой строкой на разные позиция в ArrayList правильно? Может кто-нибудь сказать мне, где во время цикла я иду не так? Спасибо!

Код:

public class ArrayListDemo

{
    public static void main (String[]args)
    {
    try
    {
        ArrayList<String> demo= new ArrayList <String>();
        FileReader fr= new FileReader("hi.tpl");
        BufferedReader reader= new BufferedReader(fr);
        String line;
        while ((line=reader.readLine()) !=null)
            {
            //Add to ArrayList
            demo.add(line);
            System.out.println(demo);
            }

        reader.close();
    }catch (Exception e)
        {
            System.out.println("Error: "+e.getMessage());
            System.exit(0);
        }
    }
}

Полученная продукция:

cat
cat, rat
cat, rat, hat

Ожидаемый результат:

cat
rat
hat

Ответы [ 9 ]

5 голосов
/ 07 января 2012

Вывод, который вы видите каждый раз, является результатом печати ArrayList.toString () для стандартного вывода. Вместо этого, переберите ArrayList после того, как вы закончили чтение содержимого файла в ArrayList:

    while ((line=reader.readLine()) !=null) {            
        //Add to ArrayList
        demo.add(line);            
    }
    reader.close();
    //do fun stuff with the demo ArrayList here
    for (String s : demo) { System.out.println(s); }
5 голосов
/ 07 января 2012

Строка:

System.out.println(demo);

Должно быть:

System.out.println(line);

Это, однако, будет выполнять чтение и печать в одном цикле.Вам может потребоваться сделать следующее после первого цикла построения массива:

for (String line : demo) {
  System.out.println(line);
}
4 голосов
/ 07 января 2012

Вы должны напечатать "line", а не "demo".Фактически, для демонстрации печати вызывается метод ToString () класса ArrayList, который, вероятно, печатает последовательность элементов массива.

Итак:

demo.add(line);
System.out.println(line);
3 голосов
/ 07 января 2012
//Add to ArrayList
demo.add(line);
System.out.println(demo);

Вы добавляете строку в список, а затем распечатываете весь список.Каждый раз.

2 голосов
/ 07 января 2012

Вы просто печатаете ArrayList, а не его члены.Вам нужно пройти через ArrayList и распечатать их по своему усмотрению (с запятой и пробелом между элементами).

1 голос
/ 07 января 2012

Вы отображаете объект оператора ArrayList through System.out.println(demo); Вам действительно нужно отображать содержимое строки ArrayList построчно, используя цикл, используя такой оператор System.out.println(line);

Itбыло бы лучше использовать foreach вместо этого следующим образом.

for (String line : demo) 
{
    System.out.println(line);
}
1 голос
/ 07 января 2012

Да, вы печатаете весь список каждый раз, потому что вы читаете и пишете в одном и том же цикле.

Вы получите ожидаемый результат, если выполните все чтения в одном циклезатем еще один только для записи.

Вот как я бы написал:

public class ArrayListDemo {
    public static void main (String [] args) {
        try {
            List<String> demo= readList(new FileReader("hi.tpl"), "\\s+");
            writeList(demo, System.out);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static List<String> readList(Reader reader, String splitRegex) throws IOException {
        List<String> values = new ArrayList<String>();

        BufferedReader br = null;
        try {
            br = new BufferedReader(reader);
            String line;
            while ((line = reader.readLine()) != null) {
                String [] tokens = line.split(splitRegex);
                for (String token : tokens) {
                    values.add(token);
                }
            }
        } finally {    
            try { if (br != null) br.close(); } catch (IOException e) { e.printStackTrace(); }
        }

        return values;
    }

    private static void writeList(List<String> list, PrintStream p) throws IOException {
        if (list != null && p != null) {
            for (String s : list) {
                p.println(s);
            }
        }
    }      
}

Еще один совет: стиль имеет значение.Ты неаккуратен с расстановкой и интервалом.Выберите стиль и будьте последовательны в этом.Ваш код труднее читать и понимать, если вы этого не сделаете.

1 голос
/ 07 января 2012

System.out.println(demo); должно быть вне цикла.

И демо будет напечатано с запятой, разделяющей строки.

Вы должны создать еще один цикл для итерации демонстрации. И напечатайте каждый элемент с помощью println.

0 голосов
/ 28 января 2017

Попробуйте, если вы используете Java 8 :

demo.forEach(System.out::println);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...