Разбить перестановочный список слов
У меня есть файл, который представляет собой перестановочный список слов, отформатированный следующим образом. То, как он отформатирован, когда я открываю его в такой программе, как блокнот, кажется, что он вообще не разнесен, так что, например, для человеческого глаза первый бит выглядит так:
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
,