1

Тема: Порівняння слів у масиві рядків Java

Доброго дня! Допоможіть будь ласка з задачею.) "У файлі містяться прізвища людей. Потрібно зчитати їх з файлу, і порівняти. Якщо є однакові, тоді записати їх у файл file1.txt, a всі, які не співпадають, у файл file2.txt"
Ось початок роботи.) як це закінчити??? *WALL*

import java.io.*;
import java.util.*;

public class IndividualExercise {
     
    public static void main(String[] args) throws IOException {
 Scanner in = new Scanner(new File("work.txt"));
       String[] list=new String[100];
       String[] list1=new String[100];
        int z=0;
        int k=0;
        int i=0,j=0;
        String[] f=new String[100];
       while(in.hasNext()){
           list[i]=in.next(); 
           z++;
            i++;
}
        System.out.println("Number of worlds->"+z);
       for(i=0;i<z;i++)
            System.out.print(list[i]+" ");

2

Re: Порівняння слів у масиві рядків Java

Який жах...
Вирівняйте код.
Приберіть змінні, які ви не використовуєте, ще встигнете їх створити. Тим змінним, що залишаться, дайте нормальні назви.
Подумайте над використанням Vector замість масивів.
І не "співпадають", це русизм, а - в цьому випадку - дублюються чи повторюються (літературно правильний аналог - збігаються - тут недоречний).

3

Re: Порівняння слів у масиві рядків Java

Untested:

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static java.util.function.Function.identity;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;

public class IndividualExercise {

    private static final Path SURNAMES_INPUT_FILE_PATH = Paths.get("surnames.txt");
    private static final Path REPEATABLE_SURNAMES_OUTPUT_FILE_PATH = Paths.get("file1.txt");
    private static final Path NON_REPEATABLE_SURNAMES_OUTPUT_FILE_PATH = Paths.get("file2.txt");

    public static void main(String[] args) throws Exception {
        try (Stream<String> surnames = Files.lines(SURNAMES_INPUT_FILE_PATH)) {
            /*
            Groups lines by surname. Returns tuples of type (surname, number_of_coincides)
            For example, for this content:
                John
                Smith
                John
            surnameCoincides will contain: [(John, 2), (Smith, 1)]
            */
            Map<String, Long> surnameCoincides
                = surnames.collect(groupingBy(identity(), counting()));

            List<String> repeatableSurnames = new LinkedList<>();
            List<String> nonRepeatableSurnames = new LinkedList<>();

            surnameCoincides.forEach((surname, coincides) -> {
                if (coincides > 1L) {
                    repeatableSurnames.add(surname);
                } else {
                    nonRepeatableSurnames.add(surname);
                }
            });

            writeLinesToFile(repeatableSurnames, REPEATABLE_SURNAMES_OUTPUT_FILE_PATH);
            writeLinesToFile(nonRepeatableSurnames, NON_REPEATABLE_SURNAMES_OUTPUT_FILE_PATH);
        }
    }

    private static void writeLinesToFile(Collection<String> lines, Path targetFile)
            throws IOException {

        String linesContent = lines.stream()
            .collect(Collectors.joining(System.lineSeparator()));

        writeStringToFile(linesContent, targetFile);
    }

    private static void writeStringToFile(String text, Path targetPath) throws IOException {
        byte[] bytes = text.getBytes(StandardCharsets.UTF_8);
        Files.write(targetPath, bytes, StandardOpenOption.CREATE);
    }
}