2015-09-13 7 views
0

У меня есть файл, который является перестановочным словом, отформатированным следующим образом. Как это отформатирован, когда я открываю его в программу, как блокнот, это, кажется, не быть растянуты на всех, так, например, для человеческого глаза, первый бит выглядит следующим образом:Разбивка переполненного списка слов

ATHROCYTESDISHLIKEIRRECOVERABLENESSESEMBRITTLEMENTSYOUNGSOVER 

но когда я копирую и мимо него, он появляется отформатированный как это:

ATHROCYTES 
    DISHLIKE 
    IRRECOVERABLENESSES 
    EMBRITTLEMENTS 
    YOUNGS 
    OVER 

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

while (dis.available() != 0) { 
      System.out.println(dis.readLine()); 
     } 

печатает документ отформатирован правильно, так же, как если бы я скопировать и вставить его. Я использую этот код, чтобы попытаться загрузить его в массив:

String[] store = sb.toString().split(","); 

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

String[] store = sb.toString().split(scan.nextLine()); 

Оба они дают мне тот же результат, слова печатаются на одной и той же линии. Кто-нибудь теперь, как я мог бы получить мои результаты, правильно отформатированные в массив?

Я включил остальную часть моего кода, так как возможно, что проблема возникает в другом месте:

public class InsertionSort { 

public static String[] InsertSort(String[] args) { 
    int i, j; 
    String key; 

    for (j = 1; j < args.length; j++) { //the condition has changed 
     key = args[j]; 
     i = j - 1; 
     while (i >= 0) { 
      if (key.compareTo(args[i]) > 0) {//here too 
       break; 
      } 
      args[i + 1] = args[i]; 
      i--; 
     } 
     args[i + 1] = key; 
     return args; 
    } 

    return args; 
} 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws FileNotFoundException, IOException { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Insertion Sort Test\n"); 


    int n; 
    String name, line; 


    System.out.println("Enter name of file to sort: "); 
    name = scan.next(); 

    BufferedReader reader = new BufferedReader(new FileReader(new File(name))); 
    //The StringBuffer will be used to create a string if your file has multiple lines 
    StringBuffer sb = new StringBuffer(); 

    File file = new File(name); 
    FileInputStream fis = null; 
    BufferedInputStream bis = null; 
    DataInputStream dis = null; 

    try { 
     fis = new FileInputStream(file); 

     // Here BufferedInputStream is added for fast reading. 
     bis = new BufferedInputStream(fis); 
     dis = new DataInputStream(bis); 

     // dis.available() returns 0 if the file does not have more lines. 
     while (dis.available() != 0) { 

    // this statement reads the line from the file and print it to 
      // the console. 
      System.out.println(dis.readLine()); 
     } 

     // dispose all the resources after using them. 
     fis.close(); 
     bis.close(); 
     dis.close(); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    while((line = reader.readLine())!= null){ 

    sb.append(line); 

} 

    //We now split the line on the "," to get a string array of the values 
    String[] store = sb.toString().split("/n"); 
    System.out.println(Arrays.toString(store)); 
    /* Call method sort */ 
    InsertSort(store); 

    n = store.length; 
    FileWriter fw = new FileWriter("sorted.txt"); 


for (int i = 0; i < store.length; i++) { 
    fw.write(store[i] + "\n"); 
} 
fw.close(); 
    } 

} 
+0

вы пробовали Notepad ++? Он работает намного лучше, чем блокнот. Линии, вероятно, разделены разрывом строки (\ n). Это должен быть ваш разделитель. Я не знаком с Java, но, похоже, это ваша проблема. –

+0

Я просто использовал блокнот, так как это .txt-файл. Я делаю все свое кодирование в NetBeans. С учетом сказанного я попытался изменить свой код, чтобы сделать split \ n, давая мне: String [] store = sb.toString(). Split ("/ n"); но я все равно получаю тот же результат, что все они находятся на одной линии. – user3068177

+0

Ну, вы использовали неправильную косую черту. Кроме того, notepad ++ лучше читает файлы, вот почему я предлагаю его. –

ответ

1

Вы преждевременное возвращение заявление здесь:

args[i + 1] = key; 
    return args; // the cause 
} 

Удалите его, и это должно быть исправлено:

[ATHROCYTES, DISHLIKE, IRRECOVERABLENESSES, EMBRITTLEMENTS, YOUNGS, OVER] 

DISHLIKE -> ATHROCYTES = 3 
IRRECOVERABLENESSES -> DISHLIKE = 5 
EMBRITTLEMENTS -> IRRECOVERABLENESSES = -4 
EMBRITTLEMENTS -> DISHLIKE = 1 
YOUNGS -> IRRECOVERABLENESSES = 16 
OVER -> YOUNGS = -10 
OVER -> IRRECOVERABLENESSES = 6 

[ATHROCYTES, DISHLIKE, EMBRITTLEMENTS, IRRECOVERABLENESSES, OVER, YOUNGS] 

Полный код:

public static String[] InsertSort(String[] args) { 
    int i, j; 
    String key; 

    System.out.println(Arrays.toString(args)); 

    for (j = 1; j < args.length; j++) { //the condition has changed 
    key = args[j]; 
    i = j - 1; 
    while (i >= 0) { 
     System.out.printf(" %s -> %s = %d\n", key, args[i], key.compareTo(args[i])); 
     if (key.compareTo(args[i]) > 0)//here too 
     break; 
     args[i + 1] = args[i]; 
     i--; 
    } 
    args[i + 1] = key; 
    } 

    return args; 
} 

public static void main(String[] args) throws FileNotFoundException, IOException { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Insertion Sort Test\n"); 

    System.out.println("Enter name of file to sort: "); 
    String name = scan.nextLine(); 

    File file = new File(name); 
    String sb = (new Scanner(file)).useDelimiter("\\Z").next(); 

    //We now split the line on the "," to get a string array of the values 
    List<String> list = Arrays.asList(sb.split("\n\r?")); 

    ArrayList<String> list2 = new ArrayList<>(); 
    list.stream().forEach((s) -> { 
    list2.add(s.trim()); 
    }); 

    System.out.println(list2); 
    /* Call method sort */ 
    String[] store = list2.toArray(new String[]{}); 

    InsertSort(store); 

    System.out.println(Arrays.asList(store)); 

    int n = store.length; 

    try (FileWriter fw = new FileWriter("sorted.txt")) { 
    StringBuilder b = new StringBuilder(); 
    for (String s: store) 
     b.append(s).append("\n"); 

    fw.write(b.toString()); 
    } 
} 
+0

Это, похоже, не изменило результат. – user3068177

+0

Обнаружена причина, см. Обновление – ankhzet

+0

Так что мне просто нужно удалить «return args;»? Если это так, я попробовал это раньше и получил тот же результат. – user3068177

0

Причина файл отображается в виде одной строки в Windows Notepad, скорее всего, потому, что Блокнот распознает только CRLF, \n\r как новая строка, в то время как большинство программ UNIX обрабатывают только LF, \n как новую строку. Ваш текстовый файл, скорее всего, был сгенерирован программой UNIX. Дальнейшее объяснение можно найти: here.

Теперь, на ваш код.

String[] store = sb.toString().split(scan.nextLine()); 

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

Что вы хотите

String[] store = sb.toString.split("\n\r?"); 

String.split() принимает Java регулярных выражений. Регулярное выражение

"\n\r?" 

эквивалентно утверждению «Разделить на Linefeed или CRLF`

Кроме того, я бы рекомендовал разборе вашу строку с Scanner вместо того, чтобы пытаться разделить его в массив.

Scanner scan = new Scanner(sb.toString()); 
while(scan.hasNextLine()) { 
    //Do stuff with scan.nextLine() 
} 

Edit: Помните, что спасся символы использовать назад слэш, а не вперед слэш. Например, \n или \r.

+0

'' \ n \ r | [\ n \ r] "' можно скомпоновать на '' \ n \ r? "', Afaik – ankhzet

+0

'' \ n \ r | [\ n \ r] "' работает с обоими Окончания строк в UNIX и Windows. '' \ n \ r "' будет работать в этом случае, но лучше всего использовать подход, который всегда будет работать. [Сканеры Java] (http://stackoverflow.com/questions/5918896/java-scanner-newline-recognition) используют '' \ r \ n \ [\ n \ r \ u2028 \ u2029 \ u0085] "' для своих значений по умолчанию регулярное выражение. –

+0

eh, regex '' \ n \ r? "' _equal_ to '" \ n \ r | [\ n \ r] "', оба из них будут записывать одни и те же последовательности ('\ n',' \ n \ r '). или вы когда-либо смотрели на модификатор '?' на '\ r' char? – ankhzet