根据特定键对HashMap项进行分组

时间:2014-04-23 04:04:17

标签: java sorting arraylist hashmap grouping

我有一个ArrayList>>它包含某些键值条目。如: -

ArrayList<HashMap<String, String>> myList = new ArrayList<HashMap<String,String>>();
HashMap<String,String> map = new HashMap<String,String>();
map.put("NewId", newId);
map.put("Title", title);
map.put("Description", description);

myList.add(map);

&#34; NEWID&#34;可以类似于多个条目。

我也有一系列颜色: -

String[] colors = new String[]{"#1F1A17", "#62934D", "#F9B03F", "#7959BC", "#74B8DE", "#E65641", "#7CC8BB", "#D7CE5D", "#D6BE95", "#B694D1"};

我想现在将所有条目分组为#34; NewId&#34;在一起并为他们分配第一种颜色,其他条目与下一个相似的&#34; NewId&#34;用第二种颜色等等,直到前10个相同的项目&#34; NewId&#34;得到各自的颜色。

例如: - 分组前

NewId  Title  Description
 101   title1  des1
 102   title2  des2
 103   title3  des3 
 101   title4  des4
 102   title5  des5
 103   title6  des6 
分组后

NewId  Title  Description
 101   title1  des1  ------> color1
 101   title4  des4  ------> color1
 102   title2  des2  ------> color2
 102   title5  des5  ------> color2
 103   title3  des3  ------> color3
 103   title6  des6  ------> color3

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:1)

你需要一个非常令人印象深刻的循环。高级for循环确实会有所帮助。如果我理解你,你想要这样的东西

int i = 0; //Or whatever the starting id number is
int j = 0; //For managing the color assigning
//If you want a new hash map Map<String, String> colorsMap = new HashMap<>();    


for (HashMap<String, String> loopMap : myList) {
     while (i < colors.length) {
         if (loopMap.containsKey("" + i) {
             loopMap.put("" + i + "color", colors[j]);
             //Or if you want to make a new HashMap: colorsMap.put("" + i, colors[j]);
         }
         i++; //Now start with next id entry
         j++; //And next color
     }
     i = 0; //Or starting id num
     j = 0; //Starting color index
} 
//If you are making a new hash map: myList.add(colorsMap);

我个人会使用一个类将数据,标题,描述和颜色数据放在一起,这将使事情变得更加简单。它会让你添加更好的方法

答案 1 :(得分:1)

您可以添加自定义列表类:

public class MyList {

    private ArrayList<HashMap<String, String>> list = new ArrayList<>();

    public boolean add(HashMap<String, String> map) {
        return list.add(map);
    }

    public void setColor(String newId, String color) {
        for (HashMap<String, String> m : list)
            if (m.containsKey(newId))
                m.put("color", color);
    }

    public String getGroupKey(String key, int i) {      
        ArrayList<String> uniqeList = getUniqKeyList(key);
        Collections.sort(uniqeList);
        return uniqeList.get(i);
    }

    public ArrayList<String> getUniqKeyList(String key){
        ArrayList<String> l = new ArrayList<>();
        for (HashMap<String, String> m : list)
            if(!l.contains(m.get(key)))
                l.add(m.get(key));
        return l;
    }
}

并且主要是每件事都清楚简单:

public static void main(String[] args) throws Exception {
        MyList myList = new MyList();
        HashMap<String,String> map = new HashMap<String,String>();
        map.put("NewId", newId);
        map.put("Title", title);
        map.put("Description", description);
        myList.add(map);

        String[] colors = new String[]{"#1F1A17", "#62934D","#B694D1"};

        int i=0;
        while (true) {
                    if(i == colors.length) 
                            break;
            String s =  myList.getGroupKey("NewId", i);
            if(s == null)
                break;
            else 
                myList.setColor(s, colors[i++]);
        }       
    }

答案 2 :(得分:0)

我建议您使用Arraylist<HashMap<string, string>>而不是使用HashMap<string, List<MyCustomObject>>CustomObject类将包含属性NewIdTitleDescription。此hashmap的Key是NewId属性。这很重要,因为您要为NewId指定每个值的颜色。使用此方法,您可以在地图中为每个条目指定一种颜色。