Печать ArrayList строк на PrintWriter с переносом слов - PullRequest
1 голос
/ 02 декабря 2010

Некоторые одноклассники и я работаем над домашним заданием для Java, которое требует, чтобы мы распечатали ArrayList of Strings на PrintWriter, используя перенос слов, чтобы ни один из выходных данных не проходил 80 символов. Мы в значительной степени погуглили это и не можем найти какой-либо способ, основанный на Java API.

Я знаю, что вообще неправильно задавать домашний задание по SO, но мы просто ищем рекомендации, как лучше всего это сделать, или если мы что-то упустили в API. Это не основная часть домашней работы, просто небольшая потребность в продукции.

В идеале, я бы хотел иметь возможность обернуть слово в строку ArrayList, поскольку она уже хорошо отформатирована.

Ответы [ 4 ]

2 голосов
/ 04 декабря 2010

Что ж, это впервые для меня, это первый раз, когда один из моих студентов опубликовал вопрос об одном из проектов, которые я им назначил.То, как он был сформулирован, что он искал алгоритм, и ответы, которыми вы все поделились, меня устраивают.Однако это типичный случай попыток усложнить ситуацию.Частью спецификации, которая не была упомянута, было то, что ограничение в 80 символов не было жестким ограничением.Я сказал, что каждая строка выходного файла должна быть длиной около 80 символов.Это было хорошо, чтобы пойти за 80 немного.В моей версии решения у меня просто был счетчик запусков, и я добавил модуль подсчета, чтобы добавить конец строки.Я изменял значение модуля, пока выходной файл не выглядел правильно.Это привело к тому, что строки с небольшими числами были действительно короткими, поэтому я использовал другой модуль, когда числа были маленькими.Это не было большой частью проекта, и интересно, что это привлекло столько внимания.

0 голосов
/ 02 декабря 2010

Я думаю, что лучшим решением будет создание собственного WrapTextWriter, который обернет любого другого писателя и переопределит метод public void write(String str, int off, int len) throws IOException. Здесь он должен работать в цикле и выполнять логику переноса.

Эта логика не так проста, как str.substring(80). Если вы имеете дело с реальным текстом и хотите обернуть его правильно (то есть не обрезайте слова, не перемещайте запятые или точки на следующую строку и т. Д.), Вы должны реализовать некоторую логику. это, вероятно, не слишком сложно, но, вероятно, зависит от языка. Например, в английском нет пробела между словом и двоеточием, в то время как во французском они ставят пробел между ними.

Итак, я выполнил поиск в течение 5 секунд и обнаружил следующее обсуждение , которое может вам помочь.

0 голосов
/ 02 декабря 2010
private static final int MAX_CHARACTERS = 80;

public static void main(String[] args) 
    throws FileNotFoundException 
{
    List<String> strings = new ArrayList<String>();

    int size = 0;

    PrintWriter writer = new PrintWriter(System.out, true); // Just as example

    for (String str : strings)
    {
        size += str.length();

        if (size > MAX_CHARACTERS)
        {
            writer.print(System.getProperty("line.separator") + str);
            size = 0;
        }
        else
            writer.print(str);
    }

}

Вы можете просто написать функцию, например "void printWordWrap(List<String> strings)", с этим алгоритмом внутри.Я думаю, это хороший способ решить вашу проблему.:)

0 голосов
/ 02 декабря 2010

Наше решение состояло в том, чтобы создать временную строку и добавлять элементы один за другим, после чего ставить запятую.Перед добавлением элемента убедитесь, что при его добавлении строка будет длиннее 80 символов, и выберите, печатать ли ее, сбросить или просто добавить.

Это по-прежнему имеет проблему с дополнительной запятой, но она устраненас таким количеством раз мы будем в порядке.Я хотел избежать этого, потому что изначально это было сложнее в моей голове, чем на самом деле.

...