如何将我从文件中读取的数据放入哈希图<字符串,设置<String>>?



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

这是我用来读取文件的代码。我使用树状图 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();

我决定使用哈希映射 id 作为键,并使用 ip 集作为值。这是正确的方法吗? 如果不是,还有什么其他选择?

您已经拥有 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类应正确实现hashCode,如果您决定将其用作键,则应equals。替代 #1 只是用户 ID 作为键。备选方案 #2 将Set<InetAddress>移动到逻辑上存在的User类中。

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

最新更新