0

我正在查看 Java 中的列表和排序。根据文档 aList是对象的有序列表,当对象是标准类时,例如StringInteger它将使用标准比较器进行比较。有几个问题浮现在脑海。

  1. 如果您列出了一些任意对象(不是标准类),您是否必须实现Comparator接口,或者它会依赖toString()

  2. 您是否必须使用 ListIterator 以您需要的顺序遍历列表?

查看文档元素在最后添加到列表中,因此除非您对其进行排序或使用 ListIterator,否则它们不会按顺序排列。

4

4 回答 4

3

添加到 a 的项目List按它们输入的顺序存储(所以它是插入顺序)。如果要对 a 进行排序List,可以使用Collections.sort(List, Comparator)Collections.sort(List)方法。

于 2014-09-22T13:23:15.473 回答
2

已排序!=已排序

有序意味着结构中的元素具有确定的顺序(由插入给出)。 Sets 是无序的,Lists 是有序的,LinkedHashSet是有序的,等等......

如果您希望列表按特定顺序排列,由

  • 自然顺序 ( implements Comparable) 或
  • 提供的订单(implements Comparator),

您必须对其进行排序(参见 参考资料Collections.sort())。

于 2014-09-22T13:25:52.873 回答
2

首先,恐怕您对有序排序的术语感到困惑。“有序”并不意味着根据任何标准对元素进行排序。这只是意味着元素顺序是可预测的。在列表的情况下,顺序由列表索引决定,例如,如果您使用add()方法添加 5​​ 个元素,您将遍历列表并以相同的顺序获取元素。

排序意味着可以使用一种可用方法(例如Collections.sort())重新排列(排序)元素。在这种情况下,比较器是相关的。

关于“标准”和非标准类。在排序方面既不String也不Integer没有任何特权。除了Comparator接口之外,JDK 还提供了由和Comparable实现的接口。这就是字符串和整数列表可以按自然顺序排序的原因。请查看上述接口的 javadoc 以获取更多详细信息。您可以让您的班级实现并享受相同的功能。StringIntegerComparable

两者都不相关Comparator,尽管它可以在实现两者时使用,但强烈不推荐。ComparabletoString()

ListIterator相对于 提供了更多的方法Iterator。例如,您可以向后遍历列表。您应该根据需要选择迭代器类型。尽管自从 java 5 发布(大约 10 年前)以来,迭代器的需求越来越少,因为所有集合都实现Iterable了可以直接在for循环中使用的实现。如果您想在迭代期间删除元素,基本上需要迭代器。BTW 从几个月前发布的 Java 8 开始List.forEach()会被越来越多地使用,因此迭代器将变得更加不受欢迎。

于 2014-09-22T13:33:05.067 回答
0

a List is an ordered list of Objects这里的“有序”是指插入顺序。

如果要按特定顺序对列表进行排序,则必须提供Comparator或使您的元素实现Comparable。你可以打电话Collectoins class's:

public static <T extends Comparable<? super T>> void sort(List<T> list)

或者

public static <T> void sort(List<T> list, Comparator<? super T> c)

如果你只想浏览你的列表,一个普通Iterator的就足够了。同时,ListIterator提供更多功能,例如:

  • 向后迭代
  • 获取前一个/下一个元素的索引
于 2014-09-22T13:25:13.987 回答