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

Posted

技术标签:

【中文标题】从具有单独行的字符串的文本中查找重新排列的字符串组【英文标题】:Finding Groups of Rearranged Strings from a txt With Strings on Seperate Lines 【发布时间】:2020-10-29 06:02:03 【问题描述】:

我想做的是输入一个看起来像这样的任意长度的 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;
    

【问题讨论】:

您的问题是什么?你的代码有错误吗?如果是这样,那是什么。您的输出是否不正确,如果是,请告诉我们实际输出吗? 对字符串的所有字符进行排序并将所有字谜存储在一个映射中。映射键是字符串的排序状态,它的列表包含所有原始字符串,它们是当前键的字谜。 【参考方案1】:

这是一种使用 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"));
    

    将输入文件的所有行读入一个列表 定义一个接受字符串并返回字符串的函数 输入的排序字符,例如 bob -> bbo 按上述函数对输入列表进行分组,流式传输 将每个列表映射到以空格分隔的字符串的结果映射 形成一行输出文本,将所有字符串收集到一个输出列表中 写入输出文件

【讨论】:

不错的答案! :)【参考方案2】:
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;

【讨论】:

以上是关于从具有单独行的字符串的文本中查找重新排列的字符串组的主要内容,如果未能解决你的问题,请参考以下文章

查找具有部分匹配的行

从Java中具有不同大小的2个数组列表中查找非相似元素

从文本文件中读取列表元组作为元组,而不是字符串 - Python

在 MySQL 中的表的多个列中查找连接的字符串

重新排列文本文件中的行列

在具有重复行的 SQL Server 表中按组查找行号