麻烦排序字符串的ArrayList

时间:2013-01-01 23:27:17

标签: java

  

可能重复:
  sort array list of special strings, by date

我有一个从文件读入的字符串ArrayList,每个字符串的第一部分是日期:12/01/2012。当我使用Collections.sort();它从一个最旧到最新的一年内排序很好,但是当它到达01/01/2013时,它会把最旧的列表放在列表的顶部。如何才能将年份作为排序的一部分?我尝试使用Date,但它做了同样的事情。每个字符串都有很多我想保留的信息,只是在开头排序。我认为没有必要发布代码,因为它正在工作,我遇到的麻烦只是排序。我在这里搜索了一段时间,并尝试了一些不同的排序选项无济于事。所以我必须感到困惑或遗忘。如果有人有任何想法如何在一开始就用日期对字符串进行排序请帮忙!谢谢!

示例字符串:“12/01/2012 34023843项目编号”

4 个答案:

答案 0 :(得分:1)

如果字符串的格式始终相同,则可以实现自定义comparator并使用Collections.sort(list,comparator) 该比较器将首先检查年份,然后是月份,然后是一天。

或者,(最好的解决方案啊),您可以重新设计一个具有多个字段(和日期)的对象列表,并使用日期实现比较器。它永远不会直接用字符串保存(例如,在字符串上使用比较器,你将无法使用其他日期格式)

答案 1 :(得分:1)

您目前正在使用字符串排序进行排序。这意味着“01/01/2013”​​在“12/31/2012”之前排序,因为“0”小于“1”。

您可以使用custom comparator来使用不同的逻辑。在你的比较器中,你会:

  1. 拆分字符串以获取日期
  2. 使用SimpleDateFormat将字段0转换为日期
  3. 然后在两个日期调用比较

答案 2 :(得分:1)

您需要一个自定义比较器。以自然顺序比较字符串(即使用String实现Comparable<String>的事实)将给出您看到的结果,因为0低于1,所以这是预期的

以下是一个可以执行所需操作的示例类,但请注意,它假设所有日期都已正确格式化(parse() DateFormat方法IllegalArgumentException如果日期未选中public final class MyComparator implements Comparator<String> { // Date parsing // Note: SimpleDateFormat is not thread-safe, if possible use Joda Time instead private static final DateFormat fmt = new SimpleDateFormat("dd/MM/YYYY"); private static final Comparator<String> INSTANCE = new MyComparator(); private MyComparator() { } public static Comparator<String> getInstance() { return INSTANCE; } @Override public int compare(String o1, String o2) { // Grab dates String s1 = o1.subString(0, 10); Date d1 = fmt.parse(s1); String s2 = o2.subString(0, 10); Date d2 = fmt.parse(s2); // Date implements Comparable<Date>, so we can use that... int ret = d1.compareTo(d2); // If dates are equal, compare the rest of the strings instead. return ret != 0 ? ret : o1.subString(10).compareTo(o2.subString(10)); } } 是不正确的):

Collections.sort(theArray, MyComparator.getInstance());

然后,您可以使用{{1}}

答案 3 :(得分:0)

@ fge的答案有效,但比较器必须多次拆分和转换字符串。实际上,对于典型的排序算法,这需要进行O(NlogN)次,其中N是列表的长度。对于大型列表,logN项将是重要的。

我的建议是创建一个自定义Line类来表示文件中的行。让构造函数将表示行的字符串解析为组件,解析日期组件并将所有相关组件保存在私有字段中。拥有自定义类实现Comparable<Line>,并实现compareTo(Line)方法以按日期比较行。

然后将文件内容表示为ArrayList<Line>而不是ArrayList<String>

(很有可能你需要解析这些行...在它们被排序之后。所以这种方法只是在排序之前进行解析,只做一次。对此,答案为“重复” “问题还包括:sort array list of special strings, by date

相关问题