Java HashMap теряет значение при итерации цикла - PullRequest
0 голосов
/ 28 апреля 2011

Я пытаюсь упорядочить список карт в алфавитном порядке. я вижу, что строка "name" заполняется соответствующим значением, но groupDataCopy никогда не обновляется. насколько я знаю, использование оператора new и вызов "put" поместит значение на карту. но я вижу, что на следующей итерации ArrayList содержит:

 {name = null}

Я не знаю, почему я теряю значения в моем списке карт. вот код:

private void sortByName() {
    List<Map<String, String>> groupDataCopy = new ArrayList<Map<String, String>>();
    List<List<Map<String, String>>> childDataCopy = new ArrayList<List<Map<String, String>>>();
    int groupPos = 0;
    int nextNamePos = 0;
    String name = null;

    while(groupPos<groupData.size()) {
        //main loop
        int groupDataComparison = 0;
        name = null;

        while(groupDataComparison<groupData.size()) {
            //comparison traversal for group
            if(!groupDataCopy.isEmpty()) {  //if groupDataCopy has data
                if(groupDataCopy.get(groupDataCopy.size()-1).get("name").compareTo(groupData.get(groupDataComparison).get("name")) > 0) {   //if the last index of groupDataCopy is alphabetically after (or equal to) last chosen name
                    if(name==null || groupData.get(groupDataComparison).get("name").compareTo(name) < 0) {
                        name = groupData.get(groupDataComparison).get("name");
                        nextNamePos = groupDataComparison;
                    }
                }
            } else {
                if(name==null || groupData.get(groupDataComparison).get("name").compareTo(name) < 0) {
                    name = groupData.get(groupDataComparison).get("name");
                    nextNamePos = groupDataComparison;
                }
            }
            groupDataComparison++;
        }
        groupDataCopy.add(new HashMap<String, String>());
        groupDataCopy.get(groupPos).put("name", name);
        childDataCopy.add(new ArrayList<Map<String, String>>());
        for(Map<String, String> data : childData.get(nextNamePos)) {
            childDataCopy.get(groupPos).add(data);
        }
        groupPos++;
    } 

    groupData = groupDataCopy;
    childData = childDataCopy;
}

Ответы [ 2 ]

1 голос
/ 28 апреля 2011
Comparator<Map<String, String> comparator = new Comparator<Map<String, String>()
{
    public int compare(Map<String, String> o1, Map<String, String> o2) 
    {
        return o1.get("name").compartTo(o2.get("name");
    }
}

Collections.sort(groupData, comparator);
0 голосов
/ 28 апреля 2011

Попробуйте создать Comparator, который позволит вам использовать Collections.sort:

Что-то вроде:

Comparator<Map<String, String> comp = new Comparator<Map<String, String>()
{
    public int compare(Map<String, String> o1, Map<String, String> o2) 
    {
        //write code to compare values
    }
}

После чего вы можете просто сделать:

Collections.sort(groupData, comp);
...