Когда я разбиваю ArrayList of Strings на #, последнее поле неверно

Новичок в java здесь. Я пытаюсь разбить строку на переменные в объекте. Как сказано в заголовке, последнее поле в строке разделяется вместе с первым полем.

Строка из моего txt файла, все остальные строки идентичны.

Вот результат:

Rolling Stone#Jann Wenner#Bi-Weekly#Boston#9000
Rolling Stone#Jann Wenner#Bi-Weekly#Philadelphia#8000
Rolling Stone#Jann Wenner#Bi-Weekly#London#10000
The Economist#John Micklethwait#Weekly#New York#42000
The Economist#John Micklethwait#Weekly#Washington#29000
Nature#Philip Campbell#Weekly#Pittsburg#4000
Nature#Philip Campbell#Weekly#Berlin#6000

    Exception in thread "main" java.lang.NumberFormatException: For input string: "9000 Rolling Stone"

9000 должно быть целым числом. И последний индекс переходит на следующую строку, потому что # там нет, что мне делать?

Я считаю, что этого кода достаточно

    static ArrayList<String> al = new ArrayList<String>(); // Consists of lines of the text file
    static ArrayList<Magazine> bl = new ArrayList<Magazine>(); // Consists of Magazine objects

for (int i = 0; i < al.size(); i++) {
                String result[] = al.get(i).split("\\#");
                for (int j = 0; j < result.length; j++) {
                    System.out.println(result[0] + "1 " + result[1] + "2 " +  result[2] + "3 " +  result[3] + "4 "+  result[4]);
                    int num = Integer.parseInt(result[4]);

У меня есть паучье чутье где-то рядом ("\ #"), но я не знаю что ...

Pastebin: http://pastebin.com/Vp9T6aSd

import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Magazine {

    private String MagazineName;
    private String Publisher;
    private String Frequency;
    private String City;
    private String objectName = "mg" + loopCount;
    private int Distribution;
    private static int loopCount = 0;

    static ArrayList<String> al = new ArrayList<String>(); // Consists of lines of the text file
    static ArrayList<Magazine> bl = new ArrayList<Magazine>(); // Consists of Magazine objects

    private static void readData() throws FileNotFoundException {
        java.io.File file = new java.io.File(
                "/Users/henrydang/Desktop/Zines.txt");
        Scanner sc = new Scanner(file);
        while (sc.hasNext()) {
            sc.useDelimiter("\\n");
            String line = sc.next();
            System.out.println(line);
            al.add(line);
            Magazine objectName;

            for (int i = 0; i < al.size(); i++) {
                String result[] = al.get(i).split("#");
                for (int j = 0; j < result.length; j++) {
                    System.out.println(result[0] + "1 " + result[1] + "2 " +  result[2] + "3 " +  result[3] + "4 "+  result[4]);
                    int num = Integer.parseInt(result[4]);

                    objectName = new Magazine();
                    objectName.setMagazine(result[0]);
                    objectName.setPublisher(result[1]);
                    objectName.setFrequency(result[2]);
                    objectName.setCity(result[3]);
                    objectName.setDistribution(num);
                    bl.add(objectName);             
                }

            }
            loopCount++;
            sc.close();

        }
    }

    public Magazine() {

    }

    public void setMagazine(String name) {
        this.MagazineName = name;
    }

    public void setPublisher(String name) {
        this.Publisher = name;
    }

    public void setFrequency(String name) {
        this.Frequency = name;
    }

    public void setCity(String name) {
        this.City = name;
    }

    public void setDistribution(int num) {
        this.Distribution = num;
    }

    public String getMagazine() {
        return MagazineName;
    }

    public String getPublisher() {
        return Publisher;
    }

    public String getFrequency() {
        return Frequency;
    }

    public String getCity() {
        return City;
    }

    public int getDistribution() {
        return Distribution;
    }

    public static void main(String args[]) throws FileNotFoundException {
        readData();
    }

}

РЕДАКТИРОВАТЬ: больше информации РЕШЕНО: текстовый файл заканчивался на / r / n вместо «/ n»


person Henry    schedule 13.01.2013    source источник
comment
Я считаю, что этого количества кода достаточно Для более быстрого получения помощи опубликуйте SSCCE.   -  person Andrew Thompson    schedule 13.01.2013
comment
Для чего нужен цикл j? Это кажется лишним.   -  person Peter Lawrey    schedule 13.01.2013
comment
Генри, не редактируйте вопросы, нажимая кнопку "Назад". Вместо этого используйте ссылку редактирования под вопросом.   -  person Andrew Thompson    schedule 13.01.2013
comment
добавьте System.out.println(al.get(i)) в свой код. Я уверен, что вы включили текст из строки ниже   -  person Boris Strandjev    schedule 13.01.2013
comment
@Henry Неправильное предположение - суффикс все равно будет добавлен как последний разделитель. Проблема ДОЛЖНА быть в al.get(i)   -  person Boris Strandjev    schedule 13.01.2013
comment
sc.useDelimiter("\\n"); Наверное, лучше заменить "\\n" на System.getProperty("line.separator").   -  person Andrew Thompson    schedule 13.01.2013
comment
Судя по его пути к файлу, он работает в системе * nix. Поскольку вы используете сканер @Henry, вы можете просто выполнить sc.nextLine (); может это решит это? Вывод al.get(i) или вашего файла Zines.txt (как-то вложения) наверняка решит проблему.   -  person Sanchit    schedule 13.01.2013
comment
@Andrew Замена \\ n на System.getProperty (line.separator) дает тот же результат.   -  person Henry    schedule 13.01.2013
comment
@Henry - Этот код кажется ошибочным - знаете ли вы, что для каждой прочитанной строки вы создаете все объекты для всех строк с нуля? 1 строка = 1 объект, 2 строки = 3 объекта, 3 строки = 5 объектов, 4 строки = 9 объектов и т. Д.   -  person RonK    schedule 13.01.2013
comment
Изменение @Sanchit с next на nextFile () не меняет вывод, но добавление # в конце каждой строки в текстовом файле решает проблему.   -  person Henry    schedule 13.01.2013
comment
@RonK, ты прав, поторопился, позволь мне реконструировать это: S   -  person Henry    schedule 13.01.2013
comment
@ Генри, проблема в том, что ваш сканер каким-то образом получает сразу 2 строки, когда вы выполняете sc.next (), мы хотим помочь вам решить эту проблему. Таким образом, нам нужен либо файл как вложение (чтобы мы могли проверить \n), либо вывод al.get(i)   -  person Sanchit    schedule 13.01.2013
comment
@Sanchit я предоставлю результат, который я получаю от al.get (i)   -  person Henry    schedule 13.01.2013
comment
@Henry Просто для аргументации - попробуйте вместо этого использовать sc.hasNextLine и sc.nextLine и посмотрите, решит ли это вашу проблему   -  person RonK    schedule 13.01.2013
comment
Я думаю, что в вашем файле есть строки, заканчивающиеся на '\ r \ n' вместо '\ n'. Я немного повозился с ним, и это единственная возможная причина. Можешь дважды проверить это, @Henry? Проверьте настройки в текстовом редакторе. Также я переместил ваш sc.close () за пределы цикла, в остальном ваш код работал безупречно.   -  person Sanchit    schedule 13.01.2013
comment
О ... только что проверил, и вы правы, и теперь я получил нужную мне переменную. Спасибо за терпение. ^^   -  person Henry    schedule 13.01.2013
comment
Я ненавижу тебя @ Генри. Дж / к. Рад, что мы разобрались. Простое использование hasNextLine () и НЕ указание ЛЮБЫХ разделителей решит эту проблему, связанную с заботой о \r\n и \n. Позвольте мне ответить вам, чтобы ваш процент не упал.   -  person Sanchit    schedule 13.01.2013


Ответы (2)


Итак, Генри ...

Пара проблем с вашим кодом:

  1. sc.close () вызывается внутри цикла while (sc.hasNext()){}.
  2. sc.setDelimiter (), вызываемый внутри sc.hasNext (), вроде бы очень сомнительный, но он работает, я думаю, когда вы вызываете .next() после установки разделителя.
  3. Мы выяснили, что проблема связана с самим входным файлом, а не с вашим кодом как таковым. Всегда дважды проверяйте свои файлы, если вы пишете код для конкретной платформы (например, с разделителем \n).

И вот ваш код с правильным / идеальным способом использования сканера для вашего кода:

private static void readData() throws FileNotFoundException {  
  java.io.File file = new java.io.File("Zines.txt");  
  Scanner sc = new Scanner(file);  
  while (sc.hasNextLine()) {  
    String line = sc.nextLine();  
  }  
  sc.close();  
}

Надеюсь, все это помогло!

Изменить: игнорировать обсуждение комментариев ниже. Мы не злимся, я переделал ответ.

person Sanchit    schedule 13.01.2013
comment
Почему нет? Это единственный способ, которым могла бы работать строка System.out.println(result[0] + "1 " + result[1] + "2 " + result[2] + "3 " + result[3] + "4 "+ result[4]). - person Sanchit; 13.01.2013
comment
Это не основная проблема. Проверьте строку, используемую для вызова _1 _._ 2_, что означает, что две последовательные строки находятся вместе. - person Srinivas; 13.01.2013
comment
Так что, по сути, al.get(i), который он нам сказал, неверен. Я понимаю, почему мы все ждем и редактируем сейчас. - person Sanchit; 13.01.2013
comment
@Sanchit Однако я возвращаю свой голос против - я думал, что # всегда нужно экранировать в регулярном выражении. Однако я попробовал и ошибся. - person Boris Strandjev; 13.01.2013
comment
@BorisStrandjev и я теперь узнали, что '\\#' = (real) '\#' и '#' - это одно и то же, когда дело доходит до java и регулярного выражения. Я добавил +1 к вашему запросу al.get (i) :) - person Sanchit; 13.01.2013

Думаю, вы могли бы попробовать:

String result[] = al.get(i).split("#\\s*");

он будет разделять подстроки всякий раз, когда встречается "#".

person Venzentx    schedule 13.01.2013