У меня есть входной файл, например
имена.txt
Maria Derek Erica
Livia Jack Anita
Kendall Maria Livia Derek
Jamie Jack
Thomson Erica
Я хочу вывести как. Удаление повторяющихся слов из имени
вывод.txt
Maria Derek Erica
Livia Jack Anita
Kendall
Jamie
Thomson
Я уже пытался прочитать файл, разделенный пробелами, а затем добавить их в ArrayList, после чего я потерял, что делать дальше, чтобы сгенерировать вывод.
import java.util.Scanner;
import java.io.*;
import java.util.ArrayList;
public class duplicate {
public static void main(String[] args) throws IOException {
ArrayList<String> list = new ArrayList<String>();
File file = new File("weather.txt");
Scanner input = new Scanner(file);
String prev = input.next();
int count = 0;
while (input.hasNext()) {
String next = input.next();
System.out.println(next);
set.add(next);
count = count + 1;
if (prev.equals(next))
{
System.out.println("Match found: -" + prev);
}
prev = next;
}
System.out.println(list);
System.out.println("Word count: " + count);
}
}
Извините, я исправил это
Почему имя Эрика полностью исчезло из вывода?
@illiteratecoder, лол, может быть, это имя его бывшей
Если порядок не имеет значения, просто используйте Задавать. Set автоматически отфильтрует повторяющийся элемент. Затем просто распечатайте этот набор. У тебя все будет отлично.
Set<String> list = new HashSet<String>();
Я пытался, но мне не удалось использовать set. Существуют ли какие-либо требования к версии для set ?
Вы даже можете сохранить набор для создания заказа как:
Set<String> uniqueNames = new LinkedHashSet<>();
Затем вы можете просто добавить элементы в свой набор:
uniqueNames.add(next);
import java.util.Scanner;
import java.io.*;
import java.util.HashSet;
public class Duplicate {
public static void main(String[] args) throws IOException {
HashSet<String> lines = new HashSet<String>();
File file = new File("weather.txt");
Scanner input = new Scanner(file);
int count = 0;
while (input.hasNext()) {
String next = input.next();
System.out.println(next);
lines.add(next);
count++;
}
input.close();
System.out.println(lines);
System.out.println("Word count: " + count);
System.out.println("Unique word count: " + lines.size());
}
}
Вы захотите использовать Set или HashSet для отслеживания повторяющихся имен и ArrayList для хранения ваших конечных строк, которые будут записаны в выходной файл.
Поскольку мы вносим изменения построчно, нам нужно 1) прочитать файл построчно, 2) разделить строку для обработки отдельных имен, 3) отредактировать строку или создать новую результирующую строку по мере необходимости, и 4) затем сохраните отредактированную строку для вывода в конце:
import java.util.*;
import java.io.*;
public class Duplicate {
public static void main(String[] args) throws IOException {
HashSet<String> uniqueNames = new HashSet<String>();
ArrayList<String> outputLines = new ArrayList<String>();
Scanner input = new Scanner(new File("input.txt"));
while (input.hasNextLine()) {
// Split a line into an array of names.
String[] names = input.nextLine().split(" ");
String edited = "";
for (int i = 0; i < names.length; i++) {
// If the name is already in the set, remove it.
if (uniqueNames.add(names[i])) {
edited += names[i] + " ";
}
}
edited = edited.strip(); // remove excess whitespace
// Add the final line to our output array.
if (!edited.equals("")) {
outputLines.add(edited);
}
}
// Write the output array to a file.
String outputFn = "output.txt";
BufferedWriter output = new BufferedWriter(new FileWriter(outputFn));
output.write(String.join("\n", outputLines));
output.close();
System.out.println("File '" + outputFn + "' created!");
}
}
Я оставляю это как упражнение, если вы хотите добавить другие функции, такие как подсчет общего количества слов или уникальных слов, поскольку вопрос, похоже, в основном касался поведения удаления дубликатов.
1) вы сделали решение, мы здесь помогаем, а не решаем; 2) ваше решение плохое
@TyulpanTyulpan Я открыт для того, чтобы оба были правдой. Давайте рассмотрим их по одному: что, по вашему мнению, плохого в моем решении и как бы вы предложили его улучшить?
Вы знаете, что это безумная практика — использовать классы вместо интерфейсов для создания объектов? Вы знаете, что эту задачу можно решить в несколько строк вместо ваших 30, используя Java 8?
@TyulpanTyulpan Мне бы хотелось увидеть решение всего в нескольких строчках, звучит очень круто!
Ваш ввод и вывод в приведенном вами примере противоречивы. Если есть дубликаты, какой из них следует сохранить? Первая, как у Марии, или последняя, как у Эрики? Что должно произойти со строкой, в которой Только содержит повторяющееся имя? Я чувствую, что вам нужно, чтобы желаемая функциональность была более четко определена здесь, прежде чем пытаться обратиться к механике того, как ее выполнить.