我刚遇到一个我无法解决的问题,我希望你的意见。 我在阅读了一些输入文件之后到达了一个阶段,其中我有一个包含数字和颜色的对象的数组列表,另一方面我有一个HashMap,其中包含这些数字与名称相关联。我想要做的是比较这两个集合中的数字,最后按名称对它们进行分组。这就是我现在所拥有的,以及我想要成功的输出。
INPUT
HashMap名称
1-比尔
2,约翰·
3,杰森
4,杰克
5迈克尔
6-克里斯
ArrayList数字
2 - 红色
3 - 黄色
的 1 -green
的 2 -Pink
的 2 -gold
的 1 -Pink
的 4 -brown
渴望输出
Bill [ green , pink ]
John[ red , pink , gold ]
Jason[ blue , red ]
Jack [ brown ]
我写了这段代码:
public Map<String,String> getAllDetails(){
HashMap<String , String> theEnd =new HashMap<String ,String>();
for (Numbers t : numbers ) {
String plate = t.getNumber();
for (Map.Entry<String, String> entry : names.entrySet()) {
String key = entry.getKey();
if(plate.equals(key)) {
theEnd.put( t.getName() ,entry.getValue());
}
}
}
return theEnd;
}
我得到的结果是Pink = Bill,gold = John,red = Jason,brown = Jack
因此,对于每种颜色,我都会得到一个名称,而不是获取每个名称的所有颜色。 如何获取所有颜色并按名称分组?
非常感谢你。
答案 0 :(得分:0)
我认为您应该使用Map<String,String[]>
或Map<String,ArrayList<String>>
,并为每个名称(String
)创建一个列表(ArrayList<String> or String[]
),然后为创建的颜色添加颜色列表。
答案 1 :(得分:0)
您的程序存在逻辑问题。像
一样改变HashMap<String , List<String>> theEnd =new HashMap<String ,List<String>>
names
上,而不是在numbers
上。你需要检查每个人是否有钥匙,即1
显着的颜色。 (数字)。List<String>
theEnd
地图上循环并显示值。最后,theEnd
分别为每个成员colors
赋值。
答案 2 :(得分:0)
您应该尝试为您的类/变量/方法找到名称,这意味着手头的域名。例如,theEnd
并不是非常明确的。从技术上讲,方法getAllDetails
在&#34;板号&#34;上进行了2个集合的连接。键。
无论如何,这是对您的问题的评论解决方案:
据我所知,你有一些类号包含一个&#34;盘子&#34;数字和颜色。根据您打算对此bean类执行的操作,您应该使用equals
和hashcode
方法。
public class Number {
String plate;
String color;
public Number(String plate, String color) {
this.plate = plate;
this.color = color;
}
public String getPlate() {
return plate;
}
public String getColor() {
return color;
}
}
我认为numbers
和names
是在getAllDetails
的全局范围内声明的集合。
List<Number> numbers = new ArrayList<>();
Map<String, String> names = new HashMap<>();
getAllDEtails
的结果是Map
,其关键字是String
,其中包含名称,值为Set
,需要String
才能容纳颜色。
public static Map<String, Set<String>> getAllDetails()
{
// No duplicate of color for each name => use a Set
Map<String , Set<String>> theEnd = new HashMap<>();
for (Number t : numbers) {
String plate = t.getPlate();
// find name associated with plate
String name = names.get(plate);
if (name != null) {
// find if the corresponding name exists in result map
Set<String> colors = theEnd.get(name);
// If the name is not already there create the Set and put the entry
if (colors == null) {
colors = new HashSet<>();
theEnd.put(name, colors);
}
// Add the color to the Set
colors.add(t.getColor());
}
}
return theEnd;
}
你可以用以下方法测试:
public static void main(String [] args) {
numbers.add(new Number("2", "red"));
numbers.add(new Number("3", "blue"));
numbers.add(new Number("2", "gold"));
numbers.add(new Number("1000", "black"));
names.put("2", "Joe");
names.put("3", "Mickael");
System.out.println(getAllDetails());
}
它给出:{Joe=[red, gold], Mickael=[blue]}
答案 3 :(得分:0)
我正在更改你的地图和列表名称只是为了让它更容易阅读,虽然你的Numbers
类有点无能为力,因为你将该属性称为名称但你实际上是指一个颜色名称,我不是现在改变了,但我建议你改变它:)
如果您使用的是JDK7或更高版本,则可以在右侧使用菱形操作符跳过类型定义,如下所示
Map<String,String> namesMap = new HashMap<>();
List<Numbers> numbers = new ArrayList<>();
来到你的getAllDetails(),你的代码的问题是你的Map值是String
类型,但你实际上想要捕获颜色字符串列表,所以改变你的theEnd
地图就像下方。
Map<String , List<String>> theEnd =new HashMap<>();
/* As you want a map( name, list(colors) ), start iterating on map
so that it's easy to read your logic. Also iterate on keySet
of numbers rather than on entries */
for(String num : namesMap.keySet()){
// get the person name for a number
String name = namesMap.get(num);
for(Numbers number : numbers){
// get the number from each Numbers object
String plate = number.getNumber();
if(plate.equals(num)){
// if numbers match get the colorsList by name
List<String> colorList = theEnd.get(name);
/*first time you find a number, colorsList
will be null, so initialize it to empty list*/
if( colorList == null) {
colorList = new ArrayList<String>();
}
colorList.add(number.getName());
/* after adding your color to colorsList,
update the entry in map again */
theEnd.put(name, colorList);
}
}
}
// Finally print your values
for(String person : theEnd.keySet()){
System.out.println(person+"->"+theEnd.get(person));
}
有了这个,为了你的输入,我得到了以下输出
Bill->[green, pink]
John->[red, pink, gold]
Jason->[yellow]
Jack->[brown]