2011-04-07 68 views
1

我创建了一个地图如下:地图 - 不断得到散列码,而不是访问值

private Map<String, List<Client>> clientCatalogue; 
this.clientCatalogue = new TreeMap<String, List<Client>>(); 

的关键是客户的名字,和值的客户的详细信息列表。

我使用keySet()遍历它。我想每次访问与键关联的每个值列表,然后在转到下一个值列表之前对其进行进一步处理。我已经将这些值复制到List类型变量(clientDetails)中,并认为我会将它们打印出来以检查它们。但是我一直在收回hashcode。为什么会这样,我能做些什么来解压缩这些哈希码并访问我想要的值?任何建议感激。

List<Client> clientDetails; 
clientDetails = new ArrayList<Client>(); 
for (String eachClient : this.clientCatalogue.keySet()) 
{ 
    clientDetails = clientCatalogue.get(eachClient); 
    System.out.println("Details of client are: " + clientDetails); 
} 
+0

你知道你不需要申报,并在单独的行初始化变量,对不对? – 2011-04-07 19:10:02

+0

如果你只是使用键来查找值,你可以迭代'values()'。如果你同时需要,迭代'entrySet()'。 – unholysampler 2011-04-07 19:15:55

+0

感谢您的帮助 – Ellie 2011-04-07 19:48:09

回答

2

试试这个:

for (String eachClient : this.clientCatalogue.keySet()) 
{ 
    List<Client> clientDetails; = clientCatalogue.get(eachClient); 

    for(Client cl : clientDetails) 
    { 

     System.out.println("Details of client are: " + cl.toString()); 
    } 
} 

的问题是,您使用的打印清单作为一个整体,而不是在列表中的个人客户。

顺便说一句,您需要在Client类中的toString()方法正确实施。

此外,您不需要为List<Clients> clientDetails创建新实例。

另外,如果你不想重复上的按键,但是,值直接做到这一点:

for (List<Client> clientDetails : this.clientCatalogue.values()) 
{ 
    for(Client cl : clientDetails) 
    {  
     System.out.println("Details of client are: " + cl.toString()); 
    } 
} 
+0

嘿,非常感谢你,你真的帮助我了解我错在哪里。我开始绝望地想要与之交手。祝你有美好的一天。 – Ellie 2011-04-07 19:45:59

0

,你应该重写的toString()方法客户类。当你试图通过sysout打印任何对象时,它的toString方法将被调用,在你的情况下它被调用了对象的类。因此,将其重写为您希望sysout为您打印它。

+0

感谢您的帮助,非常感谢 – Ellie 2011-04-07 19:49:13

0

您需要在Client类中实施toString()才能返回想要打印的详细信息。

+0

非常感谢 – Ellie 2011-04-07 19:49:32

+0

@Ellie欢迎您!请不要忘记接受你最好回答你的问题的答案。此外,当你达到15的声望时,你可以开始upvoting所有你认为有用的答案,除了接受一个。它比“谢谢你”的评论还要快! – 2011-04-07 19:52:56

0

TreeMap从AbstractMap继承它的toString方法,它看起来会尝试输出一个漂亮的地图表示,但是如果你没有给出clientDetails的toString实现,你不会得到任何漂亮的东西。尽管如此,你的字符串输出的样本仍然有助于确定。

+0

非常感谢您的帮助 – Ellie 2011-04-07 19:46:32