为什么Map中的每个键都将所有电子邮件作为从文件中读取的值

时间:2019-05-23 16:12:32

标签: java dictionary arraylist

我正在尝试读取此文件:

Peter Gibbons:pgibbons@initech.com:pete@gmail.com
Michael Bolton:mbolton@initech.com
Samir Nagheenanajar:snagheenanajar@initech.com:samir@hotmail.com
Milton Waddams:mwaddams@initech.com
Bill Lumbergh:blumbergh@initech.com:B.Lumbergh@curtin.edu.au.notreally

,然后使用Java将其输入到Map中,其中键是名称,电子邮件是每个键的值。我已经将电子邮件添加到ArrayList中,并为每个键插入它。但是,在打印地图时,每个键(名称)将包括文件中的所有电子邮件作为值!!!!

import java.util.*;
import java.io.*;

public class AddressBook
{
 //used to obtain user input
private static Scanner input = new Scanner(System.in);

public static void main(String[] args)
{
String fileName, entryName;
String clintName;       
//create a ListArray
ArrayList<String> emails = new ArrayList<String>();     
//construct the map
Map<String, ArrayList<String>> addressBook = new HashMap<>();
System.out.println(" Enter address book file name: ");
//user input
fileName = input.nextLine();
try
{
BufferedReader reader = new BufferedReader( new FileReader(fileName));
String line = reader.readLine();
while( line != null)
{
String[] parts = line.split(":");
clintName = parts[0];       
for( int i=1; i<parts.length; i++){ 
emails.add(parts[i]);}
//Adding key-vallue pairs to the HashMap
addressBook.put(clintName,emails);
line = reader.readLine();
 }
 reader.close();
 }
 catch(IOException e){
 System.out.println("Could not read from " + fileName + ": " + e.getMessage());}
 System.out.println(addressBook + "\n");}}

1 个答案:

答案 0 :(得分:0)

由于您在各行的循环迭代中重复使用了SAME精确的ArrayList,因此您会不断积累前几行 中的电子邮件,而在转到下一行时不会被删除 。< / p>

3个解决方案:

  1. emails.clear()添加到循环的开头

  2. 在循环中将您的ArrayList声明为第一行-您似乎不在循环外使用它

  3. 如果您实际上需要在循环外存储每个用户的电子邮件,请使用HashMap>存储用户到电子邮件列表的映射