用于此特定情况的最佳数据结构和排序算法

时间:2015-12-26 04:08:17

标签: java algorithm sorting

我正在编写一个小的java应用程序,它将从txt文件(制表符分隔)(id,名字,姓氏,DoB,地址)读取人员的详细信息

txt文件已按ID排序,包含大约30,000条记录。我的程序应该为用户提供按名字,姓氏或地址排序的选择。

我已经完成的是我创建了一个Person类并创建了一个Person类型的arraylist来存储所有记录,然后使用JAVA的集合排序来使用不同的比较器对它进行排序:

public static Comparator<Person> addComp = new Comparator<Person>(){
public int compare(Person P1,Person P2){
    String add1 = P1.getadd().toUpperCase();
    String add2 = P2.getadd().toUpperCase();
    return add1.compareTo(add2);
}
};

它的工作原理除了我想知道的以外,还有更快的算法,就像运行时间和复杂性一样。

就像是否有任何其他数据结构更合适,如哈希表或其他东西

1 个答案:

答案 0 :(得分:2)

我认为这是最好的方式。使用哈希表在这里没有帮助。就渐近时间复杂度而言,一般来说你不可能更快。

但是,您可以通过从文件加载后预先排序数据来改善用户体验,因此您只需更改用户交互的列表参考:

private List<Person> persons_by_id;
private List<Person> persons_by_name;
private List<Person> persons_by_address;

// ...

persons_by_id = readPersonsFromFile();
persons_by_name = new ArrayList<Person>(persons_by_id);
persons_by_address = new ArrayList<Person>(persons_by_id);
Collections.sort(persons_by_name, Person.ORDER_BY_NAME);
Collections.sort(persons_by_address, Person.ORDER_BY_ADDRESS);

您可以使用java8缩短比较器:

class Person {
    // ...
    public static final Comparator<Person> ORDER_BY_NAME =
        Comparator.comparing((Person p) -> p.getName().toUpperCase());
    public static final Comparator<Person> ORDER_BY_ADDRESS =
        Comparator.comparing((Person p) -> p.getAddress().toUpperCase());
}