Java 我解决了这个问题,但结果却是错的。代码中需要更改哪些内容?
我解决了这个问题,但结果是错的,老师说从java.util.*,只能使用java.util.regex.*,帮助解决在这种情况下如何不使用java.util.LinkedHashSet和java.util.Set的问题 代码中需要更改哪些内容 任务 必须使用正则表达式解决该任务。Java 我解决了这个问题,但结果却是错的。代码中需要更改哪些内容?,java,Java,我解决了这个问题,但结果是错的,老师说从java.util.*,只能使用java.util.regex.*,帮助解决在这种情况下如何不使用java.util.LinkedHashSet和java.util.Set的问题 代码中需要更改哪些内容 任务 必须使用正则表达式解决该任务。 该方法应将输入数据转换为以下类型的字符串(邮件域==>由邮箱在此域中注册的用户的逗号分隔的登录列表): mail.com==>伊万诺夫,布什 google.com==>奥巴马 part1.txt ivanov;Ivan
该方法应将输入数据转换为以下类型的字符串(邮件域==>由邮箱在此域中注册的用户的逗号分隔的登录列表):
mail.com==>伊万诺夫,布什
google.com==>奥巴马 part1.txt
ivanov;Ivan Ivanov;ivanov@mail.com
петров;Петр Петров;petrov@google.com
obama;Barack Obama;obama@google.com
bush;Джордж Буш;bush@mail.com
Part1.java
import java.security.SecureRandom;
import java.util.regex.Matcher;
import java.util.LinkedHashSet;
import java.util.Set;
import static Util.getMatcher;
public class Part1 {
private static final String TXTP1 = "part1.txt";
public static void main(String[] args) {
System.out.println(convert3(Util.readFile(TXTP1)));
}
public static String convert3(String input) {
String regex = "(?m)^(.+(?=;));.+;.+@(.+)(?=\\b)$";
Matcher matcher = Util.getMatcher(regex, input);
StringBuilder sb = new StringBuilder();
Set<String> set = new LinkedHashSet<>();
while (matcher.find()) {
set.add(matcher.group(2));
}
for (String s : set) {
matcher = Util.getMatcher(regex, input);
sb.append(s).append(" ==> ");
while (matcher.find()) {
if (s.equals(matcher.group(2))) {
sb.append(matcher.group(1)).append(", ");
}
}
sb.delete(sb.length() - 2, sb.length()).append(System.lineSeparator());
}
return sb.toString();
}
}
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Util {
private static final String ENCODING = "Cp1251";
public static String readFile(String path) {
String res = null;
try {
byte[] bytes = Files.readAllBytes(Paths.get(path));
res = new String(bytes, ENCODING);
} catch (IOException ex) {
ex.printStackTrace();
}
return res;
}
public static Matcher getMatcher(String regex, String input) {
Pattern p = Pattern.compile(regex);
return p.matcher(input);
}
public static void main(String[] args) {
System.out.println(readFile("part1.txt"));
}
}
您可以创建一个包含用户和电子邮件域的小数据类。(二维字符串数组也可以使用) 您提供的示例数据是一致的,因此我们可以使用regex迭代提取用户和域的输入
String input = "ivanov;Ivan Ivanov;ivanov@mail.com\n" +
"петров;Петр Петров;petrov@google.com\n" +
"obama;Barack Obama;obama@google.com\n" +
"bush;Джордж Буш;bush@mail.com";
Pattern emailPattern = Pattern.compile("(.*?);(?:.*?)@([A-Za-z]+\\.[A-Za-z]+)");
String [] inputLines = input.split("\n");
UserEmailData [] usersAndDomains = new UserEmailData[inputLines.length];
int currentLine = 0;
for (String line : inputLines){
Matcher emailMatcher = emailPattern.matcher(line);
emailMatcher.find();
String user = emailMatcher.group(1);
String domain = emailMatcher.group(2);
usersAndDomains[currentLine] = new UserEmailData(domain, user);
currentLine++;
}
提取数据后,我们可以根据域值对其进行排序:
static void sortData(UserEmailData [] data){
for(int i=0; i<data.length; i++){
for(int j=i+1; j<data.length; j++){
if(data[i].domain.compareTo(data[j].domain)>0) {
UserEmailData temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
}
剩下的就是保持连接用户,只要域保持不变,这是一项简单的任务。
在这个任务中使用正则表达式有点过分,因为您可以简单地用“;”分割字符串,并使用相同的方法。使用字符串数组。
static void sortData(UserEmailData [] data){
for(int i=0; i<data.length; i++){
for(int j=i+1; j<data.length; j++){
if(data[i].domain.compareTo(data[j].domain)>0) {
UserEmailData temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
}
for(UserEmailData data : usersAndDomains){
System.out.println(data.user + " " + data.domain);
}
петров google.com
obama google.com
ivanov mail.com
bush mail.com