Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从txt中查找字符串位于不同行上的重新排列的字符串组_Java_Algorithm_Sorting_Anagram - Fatal编程技术网

Java 从txt中查找字符串位于不同行上的重新排列的字符串组

Java 从txt中查找字符串位于不同行上的重新排列的字符串组,java,algorithm,sorting,anagram,Java,Algorithm,Sorting,Anagram,我想做的是获取任意长度的输入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 =

我想做的是获取任意长度的输入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;
    }
publicstaticvoidmain(字符串[]args){
File File=新文件(args[0]):
扫描仪扫描=新扫描仪(文件);
List anagrams=new ArrayList();
while(scan.hasNextLine()){
Scanner scan2=新扫描仪(文件);
String line=scan.nextLine();
char[]arr=line.toCharArray();
if(containsAnagram(字谜,行))
继续;
其他字谜。添加(行);
while(scan2.hasNextLine()){
字符串line2=scan2.nextLine();
if(isAnagram(arr,线路2))
fileContent2+=“”+line2;
}
fileContent+=fileContent2+“\n”;
}
}
私有静态布尔isAnagram(char[]arr,字符串行){

对于(int i=0;i,这里有一种使用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"));
    }
}
import java.io.IOException;
导入java.nio.charset.charset;
导入java.nio.file.Files;
导入java.nio.file.path;
导入java.util.List;
导入java.util.function.function;
导入java.util.regex.Pattern;
导入java.util.stream.collector;
公共类新类{
公共静态void main(字符串[]args)引发IOException{
// (1)
List input=Files.readAllLines(path.get(“输入文件的路径”);
// (2)
函数func=s->Pattern.compile(“”)
.分流河道(s)
.已排序()
.collect(收集器.joining());
// (3)
列表输出=输入。流()
.collect(收集器.groupingBy(func))
.values()
.stream()
.map(list->list.stream().sorted().collect(收集器.连接(“”))
.已排序()
.collect(Collectors.toList());
// (4)
file.write(path.get(“输出文件的路径”)、output、Charset.forName(“UTF-8”);
}
}
  • 将输入文件的所有行读取到列表中
  • 定义一个函数,该函数接受字符串并返回带有 输入的排序字符,例如bob->bbo
  • 按上述函数对输入列表进行分组,在 将每个列表映射到以空格分隔的字符串的结果映射到 形成一行输出文本,将所有字符串收集到输出列表中
  • 写入输出文件
  • publicstaticvoidmain(字符串[]args){
    File File=新文件(args[0]):
    扫描仪扫描=新扫描仪(文件);
    List anagrams=new ArrayList();
    while(scan.hasNextLine()){
    Scanner scan2=新扫描仪(文件);
    String line=scan.nextLine();
    char[]arr=line.toCharArray();
    if(containsAnagram(字谜,行))
    继续;
    其他字谜。添加(行);
    while(scan2.hasNextLine()){
    字符串line2=scan2.nextLine();
    if(isAnagram(arr,线路2))
    fileContent2+=“”+line2;
    }
    fileContent+=fileContent2+“\n”;
    }
    }
    私有静态布尔isAnagram(char[]arr,字符串行){
    
    对于(int i=0;i您的问题是什么?您的代码中有错误吗?如果有,是什么。您的输出是否不正确,如果有,请告诉我们实际的输出?对字符串的所有字符进行排序,并将所有的字符存储在映射中。映射键是字符串的排序状态,它的列表中有所有原始字符串,它们都是当前键的字符。很好答案!:)
    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;
    }