Разбить перестановочный список слов

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

    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();
     }

}

2 ответа

Решение

У вас есть преждевременное заявление на возврат здесь:

  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());
  }
}

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

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

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

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

Что вы хотите

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

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

"\n\r?"

Эквивалентно выражению "Разделить на перевод строки или CRLF"

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

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

Редактировать: Помните, что экранированные символы используют обратную косую черту, а не прямую. Например, \n или же \r,

Другие вопросы по тегам