我有一个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;
}
我怎样才能做到这一点?
我一整天都在尝试,我想我无法解决它。任何帮助表示赞赏。
答案 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
中使用它,那么Project
个Unit.id
个实例会被认为是{{1}}等于。