【问题标题】:Java-Can we keep Regex match as Hash value?Java-我们可以将正则表达式匹配为哈希值吗?
【发布时间】:2012-03-06 17:20:08
【问题描述】:

我有一个包含姓名和出生日期的文本文件,我需要按日期排序,比如

Fname LastName  dd-MM-yyyy
Fname2 Lname2  dd-MM-yyyy
Fname3 Lname3      dd-MM-yyyy
Fname4   Lname4    dd-MM-yyyy
Fname5 Lname5 dd-MM-yyyy

我可以通过匹配正则表达式(如"\\d\\d-\\d\\d-\\d\\d\\d\\d")将 DOB 作为哈希值,并将名称作为哈希键,以便按 DOF 排序很容易。或者建议我如何将其拆分为 Column[0] Column[1] 以便 Column[1] 具有日期。

【问题讨论】:

  • 您是否考虑过创建一个包含名称和日期的 DateOfBirth 对象来表示您的条目?您可以通过实现 Comparable 或创建 Comparator 轻松订购它们。
  • 我做了这样的事情link

标签: java sorting hashmap


【解决方案1】:

您的第一个问题是确定如何拆分名称并不容易。有些姓有空格,有些名字有空格:

Jill St. John
Billy Bob Thornton

我建议添加一个分隔符以更轻松地解决此问题。

然后,例如,将名称和出生日期字段封装在一个名为“Person”的类中。

将您的人员添加到列表中。然后您可以实现Collections.sort 对您的列表进行排序。

使用散列值的问题是在花园式的 HashMap 和 TreeMap 类中不允许重复。也就是说,如果两个人的生日在同一天,一个人将被覆盖。

【讨论】:

    【解决方案2】:

    无论如何,您都必须从文件中提取这些数据。所以我建议为数据创建类并实现一个可比较的接口:

    public class Person implements Comparable<Person> {
    
        static final SimpleDateFormat DATE_PARSER = new SimpleDateFormat("dd-MM-yyyy");
    
        String firstName;
        String lastName;
        Date dateOfBirth;
    
        public Person(String firstName, String lastName, String dateOfBirth) throws     ParseException {
            this.firstName = firstName;
            this.lastName = lastName;
            this.dateOfBirth = DATE_PARSER.parse(dateOfBirth);
        }
    
        @Override
        public int compareTo(Person o) {
            return this.dateOfBirth.compareTo(o.dateOfBirth);
        }
    }
    

    现在,在阅读过程中,只需将所有这些记录放入SortedSet 实现中,例如:TreeSet。您还可以将记录存储到数组或列表中,并使用ArraysCollections 类对其进行排序。最重要的是实现 Comparable。

    【讨论】:

    • SortedSet 是否允许重复 DOB?
    • 排序答案是否定的。一般来说,集合不允许重复。如果您需要重复 - 使用 List 实现(例如 ArrayList)并使用 Collections.sort(personList) 对其进行排序。
    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2018-01-12
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多