根据键属性转换给定SortedMap的排序顺序

时间:2014-03-04 20:39:18

标签: java data-structures map treemap sortedmap

我有一个SortedMap(实现是一个TreeMap),看起来像这样:

[ProjectOne] -> [ActivityOne,ActivityTwo,ActivityThree]
[ProjectTwo] -> [ActivityFour,ActivityFive,ActivitySix]
[ProjectThree] -> [ActivitySeven,ActivityEight,ActivityNine]
[ProjectFour] -> [ActivityTen,ActivityEleven,ActivityTwelve]

每个活动都有一个项目,目前地图按活动项目分组。所以ActivityOne有ProjectOne,ActivityFour有ProjectTwo等..

每个项目都有一个单位。所以类看起来像这样:

class Project{
    int id;
    Unit unit;
}

和单元类:

class Unit{
    int id;
}

和活动类:

class Activity{
    int id;
    Project project;
}

现在假设ProjectOne和ProjectThree具有相同的Unit(假设id = 1),ProjectTwo和ProjectFour具有相同的Unit(其中id = 2)。我需要将SortedMap转换为:

[ProjectOne] -> [ActivityOne,ActivityTwo,ActivityThree]
[ProjectThree] -> [ActivitySeven,ActivityEight,ActivityNine]
[ProjectTwo] -> [ActivityFour,ActivityFive,ActivitySix]
[ProjectFour] -> [ActivityTen,ActivityEleven,ActivityTwelve]

我的意思是,我需要根据项目元素的单位对给定的地图进行排序。

所以我需要一个方法:

public SortedMap<Project,List<Activity>> sortByUnits(SortedMap<Project,List<Activity>> mapToBeSorted){
    // Implementation here... 
    return newMapThatIsSorted;
}

我怎样才能做到这一点?

我一整天都在尝试,我想我无法解决它。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

为了正常工作,Project需要一个额外的属性,例如id

class Project {
    String id;
    Unit unit;
    public Project(final String id) {
        this.id = id;
    }
    @Override
    public String toString() {
        return this.id + ": unit = " + this.unit.id;
    }
}

然后我们准备使用自定义Comparator设置地图:

final SortedMap<Project, List<Activity>> map = new TreeMap<>(new Comparator<Project>() {
    @Override
    public int compare(final Project p1, final Project p2) {
        final int c = Integer.valueOf(p1.unit.id).compareTo(Integer.valueOf(p2.unit.id));
        if (c != 0) {
           return c;
        }
        return p1.id.compareTo(p2.id);
    }
});

如果我们不将id添加到Project并在Comparator中使用它,那么ProjectUnit.id个实例会被认为是{{1}}等于。