Java 5库中是否已经提供了一个方法来将元素添加到按字母顺序排列的List
?
换句话说,我说List<String>
有三个元素{"apple","cat","tree"}
,我想添加String
“香蕉”,同时按字母顺序保留List
;是否可以轻松地将其添加到List
,以便List
现在有四个元素{"apple","banana","cat","tree"}
?
答案 0 :(得分:7)
您可以使用PriorityQueue
。它们根据它们所拥有的对象的比较器进行排序。默认情况下,Strings
根据第一个不同字符的ASCII值进行排序,这将给出您想要的结果(只要所有单词的大小写都相同。)
快速举例:
PriorityQueue<String> pq = new PriorityQueue<String>();
pq.add("banana");
pq.add("apple");
pq.add("orange");
pq.poll(); // Returns "apple"
pq.poll(); // Returns "banana"
pq.poll(); // Returns "orange"
请注意add()
和poll()
的Big-O运行时为O(logn)
。
修改:PriorityQueue
最好是按顺序删除项目,但您需要按顺序对集合进行TreeSet
迭代。
答案 1 :(得分:5)
有SortedSet和SortedMap。然而,两者都不能支持重复。如果这是您需要的,那么使用Set数据结构。你的返回类型需要是List然后他使用Collections.list(set)将最终的Set转换为List。 javadoc http://download.oracle.com/docs/cd/E17476_01/javase/1.4.2/docs/api/java/util/Collections.html#list(java.util.Enumeration)
答案 2 :(得分:1)
我知道最简单的方法是添加元素,然后在列表中使用Collections.sort()
。 String
将按字典顺序排序。 Collections.sort()
适用于包含实现Compare接口的元素的任何List。如果要轻松地对自定义对象列表进行排序,请确保您的T实现可比较。
编辑:当然,正如其他海报所指出的那样,有更好的数据结构。但是,如果你绝对需要一个List
,那么这就是快速肮脏的方式。
答案 3 :(得分:1)
尝试查看TreeSet。 如果您只添加字符串,则默认的String.compareTo()已经实现。
否则,您可以构建一个比较器来为您进行排序。
答案 4 :(得分:1)
假设您从一个空列表开始并向其添加元素,同时保持其按排序顺序,您将
e.g。
String element = "banana";
List<String> list = new ArrayList<String>();
int i = Collections.binarySearch(list, element);
if (i < 0) {
list.add(-(i+1), element);
} else {
list.add(i, element);
}
PS。当不可随机搜索时,Collections.binarySearch()将降级为线性搜索。
答案 5 :(得分:1)
List
是一个无序集合。虽然您可以在添加或正确索引添加后对其进行排序,但使用为维护订单而构建的集合(如TreeSet
)更容易。这将确保通过更改集合进行排序,并确保集合平衡以便快速访问。
答案 6 :(得分:0)
如果您想自己动手,可以二进制搜索,找到按字母顺序添加每个项目的位置,然后将其添加到该位置,这将使列表按排序顺序排列。
编辑:如果您想要List
的所有功能,同时仍然对其进行排序,则可能需要执行此操作。
答案 7 :(得分:0)
我写的addToSorted
函数默认不是由Java提供的,但仍然非常简单。如果找到元素,Collections.binarySearch
函数将返回值>= 0
,如果未找到该值,则返回值< 0
。在后一种情况下,它返回插入位置(稍微编码,使其始终为负)。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class BinSort {
private static void addToSorted(List<String> list, String element) {
int index = Collections.binarySearch(list, element);
if (index < 0)
list.add(-(index + 1), element);
}
public static void main(String[] args) {
List<String> words = new ArrayList<String>();
words.add("apple");
words.add("cat");
words.add("tree");
addToSorted(words, "banana");
System.out.println(words);
}
}