Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.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 我解决了这个问题,但结果却是错的。代码中需要更改哪些内容?_Java - Fatal编程技术网

Java 我解决了这个问题,但结果却是错的。代码中需要更改哪些内容?

Java 我解决了这个问题,但结果却是错的。代码中需要更改哪些内容?,java,Java,我解决了这个问题,但结果是错的,老师说从java.util.*,只能使用java.util.regex.*,帮助解决在这种情况下如何不使用java.util.LinkedHashSet和java.util.Set的问题 代码中需要更改哪些内容 任务 必须使用正则表达式解决该任务。 该方法应将输入数据转换为以下类型的字符串(邮件域==>由邮箱在此域中注册的用户的逗号分隔的登录列表): mail.com==>伊万诺夫,布什 google.com==>奥巴马 part1.txt ivanov;Ivan

我解决了这个问题,但结果是错的,老师说从java.util.*,只能使用java.util.regex.*,帮助解决在这种情况下如何不使用java.util.LinkedHashSet和java.util.Set的问题

代码中需要更改哪些内容

任务

必须使用正则表达式解决该任务。
该方法应将输入数据转换为以下类型的字符串(邮件域==>由邮箱在此域中注册的用户的逗号分隔的登录列表):
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