我需要在文本文件中对字符串进行排序。但每次编译程序时,文本文件都是这样的:
10::name::birthday::address::email::fax::mobilenum::homeNum::
11::name::birthday::address::email::fax::mobilenum::homeNum::
1::name::birthday::address::email::fax::mobilenum::homeNum::
2::name::birthday::address::email::fax::mobilenum::homeNum::
这是我的代码:
public static void main(String[] args) throws Exception {
BufferedReader reader = new BufferedReader(new FileReader("Phonebook.txt"));
LinkedList<String> contacts = new LinkedList<String>();
String line;
while((line = reader.readLine()) != null) {
contacts.add(line);
}
Collections.sort(contacts);
FileWriter fileOut = new FileWriter("Phonebook.txt");
for(String sorted:contacts) {
fileOut.write(sorted+"\n");
}
fileOut.close();
}
答案 0 :(得分:2)
$compile(myEl.contents())($scope);
我在这里可以看到10::name::birthday::address::email::fax::mobilenum::homeNum::
Class
。您最好创建一个Contact
类。
现在,对于每一行你都有Contact
,假设第一个数字,即。Contact
对每个联系人都是唯一的。
创建一种方法,只需将10
转换为String
Contact
,然后为每行列出Object
s的方法调用方法。
要使Contact
工作Collection.sort(contactList)
,您的Contact
课程必须实施Comparable
例如:
public class Contact implements Comparable<Contact> {
@Override
public int compareTo(Contact contact) {
//add null check
return this.id.compareTo(contact.getId());//Considering Integer type for Id
}
}
答案 1 :(得分:1)
您可以这样做:
Collections.sort(contacts,new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.matches("^\\d+\\:\\:.+") && o2.matches("^\\d+\\:\\:.+")) {
return Integer.parseInt(o1.split("::")[0]) - Integer.parseInt(o2.split("::")[0]);
}
return 0;
}
});
这将按数字而不是按字母顺序对contacts
列表进行排序。
答案 2 :(得分:1)
您可以获取行的整数部分,在TreeMap中可以将其用作键,将整行用作值。 TreeMap让我们可以根据键对值进行排序,因为我们将使用Integer
,我们将获得数字顺序,而不是像字符串
您的代码可能如下所示:
Map<Integer, String> map = new TreeMap<>();
while((line = reader.readLine()) != null) {
map.put(Integer.valueOf(line.substring(0, line.indexOf("::"))), line);
// | | |
// | | find index of first ::
// | take part of string from start till first ::
// convert String to Integer
}
for (String line : map.values()){
System.out.println(line);//or write to file
}