我正在编写一个小的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);
}
};
它的工作原理除了我想知道的以外,还有更快的算法,就像运行时间和复杂性一样。
就像是否有任何其他数据结构更合适,如哈希表或其他东西
答案 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());
}