我没有找到适合下列情况的解决方案。我有员工姓名和位置。在每个地方,许多员工都可以工作。 示例:假设员工姓名是唯一的,因此我将其视为键和值作为位置。
TreeMap<String,String> t=new TreeMap<String,String>();
t.put(mike, Houston);
t.put(arian, Houston);
t.put(John, Atlanta);
我的方案是我必须编写自己的comparator
,其中位置首先排序,当有多个同名位置时,它们需要按employees
排序。任何形式的帮助表示赞赏。
答案 0 :(得分:1)
问题在于您的数据结构。 TreeMap确保您的密钥始终按顺序排序,但您的密钥没有您需要排序的完整信息。相反,你需要的可能是
TreeSet<Employee> employees = new TreeSet<>(employeeComparator);
员工是:
public class Employee {
private String name;
private String location;
/* getters & setters omitted */
}
现在您可以为Employee
创建一个比较器答案 1 :(得分:0)
你需要一个结构,并且比较:
public class EmpLoc implements Comparable<EmpLoc> {
String employee;
String location;
public EmpLoc (String _employee, String _location)
{
employee=_employee;
location=_location;
}
@Override
public int compareTo(EmpLoc other)
{
int last = this.location.compareTo(other.location);
return last == 0 ? this.employee.compareTo(other.employee) : last;
}
}
答案 2 :(得分:0)
您可以使用类似的结构:
Map<String, List<String>> map = new TreeMap<>(<your_own_comparator_for_locations_or_default_one>);
这是Multimap
,这是通过传统方式实现的,但也有第三方实现,例如Guava。 Guava有一些多重映射的排序,同步和不可变实现,你可以默认使用它们或者看看如何做一些事情。
您可以输入如下值:
public void putEmployees(String location, String employee) {
List<String> employees = map.get(location);
if (employee == null) {
employees = new ArrayList<>();
}
employees.add(employee);
Collections.sort(employees, <your_own_comparator_for_employees_or_default_one>);
map.put(location, employees);
}