从具有单独行上的字符串的文本中查找排列的字符串组

Finding Groups of Rearranged Strings from a txt With Strings on Seperate Lines

我想做的是输入一个任意长度的 txt 文件,如下所示

bob
joe
obb
oej

并生成一个输出 txt 文件,该文件在输出 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;
    }

这是使用 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. 定义一个接受字符串的函数和returns一个字符串 输入的排序字符,例如 bob -> bbo
  3. 按上述函数对您的输入列表进行分组,流过 结果映射将每个列表映射到 space 分隔字符串 形成一行输出文本,将所有字符串收集到一个输出列表
  4. 写入输出文件
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;
}