如何使用java在文本文件中以数字方式对字符串进行排序?

时间:2015-09-05 11:54:37

标签: java sorting file-io text-files

我需要在文本文件中对字符串进行排序。但每次编译程序时,文本文件都是这样的:

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();
}

3 个答案:

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