Java是否有内置的方法将元素添加到按字母顺序排列的列表中?

时间:2010-07-08 17:43:07

标签: java

Java 5库中是否已经提供了一个方法来将元素添加到按字母顺序排列的List

换句话说,我说List<String>有三个元素{"apple","cat","tree"},我想添加String“香蕉”,同时按字母顺序保留List;是否可以轻松地将其添加到List,以便List现在有四个元素{"apple","banana","cat","tree"}

8 个答案:

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

假设您从一个空列表开始并向其添加元素,同时保持其按排序顺序,您将

  1. 通过线性搜索(如果使用链接列表)或二进制搜索(如果使用数组列表)找到插入点
  2. 在插入点,比如我,你会使用list.add(i,element)
  3. 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);
  }
}