如何在java中编写自己的比较器类?

时间:2015-12-02 11:47:32

标签: java collections comparator treemap

我没有找到适合下列情况的解决方案。我有员工姓名和位置。在每个地方,许多员工都可以工作。 示例:假设员工姓名是唯一的,因此我将其视为键和值作为位置。

TreeMap<String,String> t=new TreeMap<String,String>();
t.put(mike, Houston);
t.put(arian, Houston);
t.put(John, Atlanta);

我的方案是我必须编写自己的comparator,其中位置首先排序,当有多个同名位置时,它们需要按employees排序。任何形式的帮助表示赞赏。

3 个答案:

答案 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);
}