List和HashMap组

时间:2015-02-19 16:53:30

标签: java arraylist hashmap

我刚遇到一个我无法解决的问题,我希望你的意见。 我在阅读了一些输入文件之后到达了一个阶段,其中我有一个包含数字和颜色的对象的数组列表,另一方面我有一个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

因此,对于每种颜色,我都会得到一个名称,而不是获取每个名称的所有颜色。 如何获取所有颜色并按名称分组?

非常感谢你。

4 个答案:

答案 0 :(得分:0)

我认为您应该使用Map<String,String[]>Map<String,ArrayList<String>>,并为每个名称(String)创建一个列表(ArrayList<String> or String[]),然后为创建的颜色添加颜色列表。

答案 1 :(得分:0)

您的程序存在逻辑问题。像

一样改变
  1. 将地图值转换为列表,如HashMap<String , List<String>> theEnd =new HashMap<String ,List<String>>
  2. 第一个循环应该在names上,而不是在numbers上。你需要检查每个人是否有钥匙,即1显着的颜色。 (数字)。
  3. 将内部号码对象值添加到List<String>
  4. 完成循环后,在theEnd地图上循环并显示值。
  5. 最后,theEnd分别为每个成员colors赋值。

答案 2 :(得分:0)

您应该尝试为您的类/变量/方法找到名称,这意味着手头的域名。例如,theEnd并不是非常明确的。从技术上讲,方法getAllDetails在&#34;板号&#34;上进行了2个集合的连接。键。

无论如何,这是对您的问题的评论解决方案:

据我所知,你有一些类号包含一个&#34;盘子&#34;数字和颜色。根据您打算对此bean类执行的操作,您应该使用equalshashcode方法。

    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;
        }
    }

我认为numbersnames是在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]