从具有单独行上的字符串的文本中查找排列的字符串组
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"));
}
}
- 将输入文件的所有行读入列表
- 定义一个接受字符串的函数和returns一个字符串
输入的排序字符,例如 bob -> bbo
- 按上述函数对您的输入列表进行分组,流过
结果映射将每个列表映射到 space 分隔字符串
形成一行输出文本,将所有字符串收集到一个输出列表
- 写入输出文件
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;
}
我想做的是输入一个任意长度的 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"));
}
}
- 将输入文件的所有行读入列表
- 定义一个接受字符串的函数和returns一个字符串 输入的排序字符,例如 bob -> bbo
- 按上述函数对您的输入列表进行分组,流过 结果映射将每个列表映射到 space 分隔字符串 形成一行输出文本,将所有字符串收集到一个输出列表
- 写入输出文件
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;
}