有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将我从文件中读取的数据放入hashmap<String,Set<String>>?

我需要存储我读过的文件中的数据,数据结构是:ip地址和id(1.10.186.214;2812432),id可以有多个ip

下面是我用来读取文件的代码。我使用Treemap userdb来存储有关用户的信息。我还需要另一个地图来存储id和ip

File file = new File(path);
        Scanner scanner = new Scanner(file);
        Map<String, User> userdb = new TreeMap<>();
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            String ip = line.split(";")[0];
            String id = line.split(";")[1];
            String fio = line.split(";")[2];
            String adress = line.split(";")[3];
            User user = new User(id, fio, adress);
            userdb.put(id, user);
        }
        scanner.close();

我已经决定使用HashMapID作为键,使用ip集作为值。这条路对吗?如果不是,还有什么其他选择


共 (1) 个答案

  1. # 1 楼答案

    您已经拥有IP地址所属的User,我建议您将其用作第二个数据结构的密钥:

    Map<User, Set<InetAddress>> mappings = new HashMap<>();
    

    (我在这里使用了InetAddress,但你可能已经有了这个类?)

    然后,您可以查找或创建给定用户的IP地址集,并添加新条目:

    InetAddress address = InetAddress.getByName(ip);
    mappings.computeIfAbsent(user, ignored -> new HashSet<>()).add(address);
    

    您的代码还有几个其他可能的问题:

    1. 您将每一行拆分为四个组件,但示例数据只有两个组件

    2. 当您声明一个用户可以有多个IP地址(这是第二个数据结构的要点)时,可以为每个条目创建一个新的用户。首先要检查用户是否已经在userdb中,即:

            final User user;
            if(users.containsKey(id)) {
                user = users.get(id);
            }
            else {
                user = new User(id);
                users.put(id, user);
            }
    

    (您可以在这里再次使用computeIfAbsent方法来简化逻辑)

    如果您决定将User类用作键,那么它应该正确地实现hashCodeequals。备选方案#1仅将用户ID作为密钥。备选方案#2将Set<InetAddress>移动到User类中,它在逻辑上仍然存在

    最后,把这条线拆分四次并没有多大意义,我想这对这个练习来说并不重要,但养成一个好习惯:final String[] parts = line.split(";"); String ip = parts[0]; ...