Поиск групп переставленных строк из текстового файла со строками на отдельных строках - PullRequest
2 голосов
/ 08 июля 2020

Я бы хотел взять входной txt-файл любой длины, который выглядит примерно так

bob
joe
obb
oej

, и создать выходной txt-файл, который сортирует группы переупорядоченных слов в одной строке и по алфавиту в выходном текстовом файле.

bob obb
joe oej

Вот то, что я пытался до сих пор, где args[0] - это файл с именем input.txt, переданный в командной строке.

   public static void main(String[] args) {
    File file = new File(args[0]):
    Scanner scan = new Scanner(file);
    List<char[]> anagrams = new ArrayList();

    while (scan.hasNextLine()) {
        Scanner scan2 = new Scanner(file);
        String line = scan.nextLine();
        char[] arr = line.toCharArray();

        if (containsAnagram(anagrams, line))
            continue;
        else anagrams.add(line);

        while (scan2.hasNextLine()) {
            String line2 = scan2.nextLine();
   
            if (isAnagram(arr, line2))
                fileContent2+=” ”+line2;
        }
        fileContent+=fileContent2+”\n”;
    }
}

private static boolean isAnagram(char[] arr, String line) {
    for (int i=0; i<arr.length; i++) {
        if (!Arrays.asList(line).contains(arr(i))
            break;
        if (i=arr.length-1)
            return true;
    }

Ответы [ 2 ]

3 голосов
/ 08 июля 2020

Вот компактный способ достичь того, что вам нужно, используя java файлы, потоки и функцию .nio:

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.function.Function;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class NewClass {

    public static void main(String[] args) throws IOException {
         // (1)
        List<String> input = Files.readAllLines(Paths.get("path to your input file"));
        // (2)
        Function<String,String> func = s -> Pattern.compile("")                     
                                                    .splitAsStream(s)
                                                    .sorted()
                                                    .collect(Collectors.joining());
        // (3)
        List<String> output = input.stream()                                       
                                    .collect(Collectors.groupingBy(func))
                                    .values()
                                    .stream()                
                                    .map(list -> list.stream().sorted().collect(Collectors.joining(" ")))
                                    .sorted()
                                    .collect(Collectors.toList());
        // (4)
        Files.write(Paths.get("path to your output file"), output, Charset.forName("UTF-8"));
    }
}
  1. Прочитать все строки входного файла в список
  2. Определите функцию, которая принимает строку и возвращает строку с отсортированными символами ввода, например, bob -> bbo
  3. группирует список ввода по указанной выше функции, передает значения результирующей карты, сопоставляя каждый list в строку, разделенную пробелами, чтобы сформировать строку выходного текста, собрать все строки в выходной список
  4. записать в выходной файл
0 голосов
/ 08 июля 2020
public static void main(String[] args) {
    File file = new File(args[0]):
    Scanner scan = new Scanner(file);
    List<char[]> anagrams = new ArrayList();

    while (scan.hasNextLine()) {
        Scanner scan2 = new Scanner(file);
        String line = scan.nextLine();
        char[] arr = line.toCharArray();

        if (containsAnagram(anagrams, line))
            continue;
        else anagrams.add(line);

        while (scan2.hasNextLine()) {
            String line2 = scan2.nextLine();
   
            if (isAnagram(arr, line2))
                fileContent2+=” ”+line2;
        }
        fileContent+=fileContent2+”\n”;
    }
}

private static boolean isAnagram(char[] arr, String line) {
    for (int i=0; i<arr.length; i++) {
        if (!Arrays.asList(line).contains(arr(i))
            break;
        if (i=arr.length-1)
            return true;
    }

    return false;
}

private static boolean containsAnagram(List<char[]> list, String line) {
    for (char[] anagram : list) {
        if (isAnagram(anagram, line))
            return true;
    }

    return false;
}
...