#java
#java
Вопрос:
Во-первых, у меня уже есть этот код:
public class TextTest {
public static void main(String[] args) {
try {
List<Text> v = new ArrayList<Text>();
v.add(new Text(args[0]));
v.add(new Text(args[1]));
v.add(new Text(args[2]));
System.out.println(v);
Collections.sort(v);
System.out.println(v);
}
catch ( ArrayIndexOutOfBoundsException e) {
System.err.println("Enter three files for comparation");
}
}
И мне нужно создать класс Text
с именем, который будет содержать код, который откроет и прочитает текстовый файл. Но, как я создаю конструктор, чтобы получить каталог с gonna, содержащий 3 текстовых файла, и в то же время создавать архивы и читать их? Файлы будут сохранены здесь:
v.add(new Text(args[0]));
v.add(new Text(args[1]));
v.add(new Text(args[2]));
Ответ №1:
Допустим, у вас есть 3 текстовых файла text1.txt
, text2.txt
, и text3.txt
со следующим содержимым:
text1.txt:
A B C D E F G H I J
text2.txt:
A B C D E F G H I J K L M N O
text3.txt:
A B C D E F G H I J K L
Вы могли бы Text
реализовать Comparable<Text>
:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class Text implements Comparable<Text> {
private final String fileName;
private String fileData;
private int wordCount;
public Text(String filePath) {
File file = new File(filePath);
this.fileName = file.getName();
try {
BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
StringBuilder sb = new StringBuilder();
String line = bufferedReader.readLine();
int wordCount = 0;
while (line != null) {
wordCount = line.split(" ").length;
sb.append(line);
sb.append(System.lineSeparator());
line = bufferedReader.readLine();
}
this.fileData = sb.toString().strip();
this.wordCount = wordCount;
} catch (IOException e) {
e.printStackTrace();
}
}
public String getFileData() {
return this.fileData;
}
@Override
public String toString() {
return String.format("%s [%d]", this.fileName, this.wordCount);
}
@Override
public int compareTo(Text t) {
if (this.wordCount == t.wordCount) {
return this.fileData.compareTo(t.getFileData());
}
return this.wordCount - t.wordCount;
}
}
Пример использования:
$ javac TestText.java Test.java
$ java TextText text1.txt text2.txt text3.txt
[text1.txt [10], text2.txt [15], text3.txt [12]]
[text1.txt [10], text3.txt [12], text2.txt [15]]
Комментарии:
1. Спасибо вам большое, прояснили все мои сомнения! Но, еще один вопрос, как мне напечатать только имя архивов вместо их содержимого?
2. Итак, вы хотите, чтобы список содержал имена файлов? Но все равно сортирует содержимое?
3. @LucianoBalestrinCorrea Добавил сортировку на основе количества слов, а затем по содержимому файла, если количество слов равно 🙂 Также, к вашему сведению, вы получаете баллы за принятие ответа, кстати.
4. Ооо, еще раз спасибо!! Мне удалось это сделать, с небольшим трудом, но я это сделал. Я новичок в Java 🙂
5. Обновленный ответ. Удачи!