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