[英]How to put data i read from file to 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();
我決定使用 Hashmap 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);
您的代碼還有其他幾個可能的問題:
您將每一行分成四個部分,但您的示例數據只有兩個?
當您聲明一個用戶可以擁有多個 IP 地址(這是第二個數據結構的點)時,您將為每個條目創建一個新用戶。 您要先檢查userdb
是否已經有該用戶,即:
final User user;
if(users.containsKey(id)) {
user = users.get(id);
}
else {
user = new User(id);
users.put(id, user);
}
(您可以在computeIfAbsent
再次使用computeIfAbsent
方法來簡化邏輯)。
如果您決定使用它作為鍵,您的User
類應該正確實現hashCode
和equals
。 替代方案 #1 只是用戶 ID 作為密鑰。 備選方案#2 將Set<InetAddress>
移動到它邏輯上無論如何都存在的User
類中。
最后,將線分割四次沒什么意義,我想這對這個練習來說無關緊要,但養成一個好習慣: final String[] parts = line.split(";"); String ip = parts[0]; ...
final String[] parts = line.split(";"); String ip = parts[0]; ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.