Java集合——算法

1.排序与混排:

如今排序算法已经成为大多数编程语言标准库中的一个组成部分

1.1java.util.Collections 1.2:

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

    使用稳定的排序算法,对列表中的元素进行排序。这个算法的时间复杂度是O(n logn),其中n为列表长度

    static void shuffle(List<?> elements)

    static void shuffle(List<?> elements , Random r)

    随机地打乱表中的元素。这个算法的时间复杂度是O(n a(n)),n是列表的长度,a(n)是访问元素的平均时间

1.2java.util.List<E> 1.2:

    default void sort(Comparator<? super T> comparator) 8

    使用给定比较器对列表排序

1.3java.util.Comparator<T> 1.2:

    static <T extends Comparable<? super T>> Comparator<T> reverseOrder() 8

    生成一个比较器,将逆置Comparable接口提供的顺序

    default Comparator<T> reversed() 8

    生成一个比较器,将逆置这个比较器提供的顺序

2.二分查找:

只有采用随机访问,二分查找才有意义

2.1java.util.Collections 1.2:

    static <T extends Comparable<? super T>> int binarySearch(List<T> elements , T key)

    static <T> int binarySearch(List<T> elements , T key , Comparator<? super T> c)

    从有序列表中搜索一个键,如果元素拓展了AbstractSequentialList类,则采用线性查找,否则将采用二分查找。

    这个方法的时间复杂度为O(a(n) log n),n为列表的长度,a(n)是访问一个元素的平均时间。

    这个方法将返回这个键在列表中的索引,如果在列表中不存在这个键将返回负值i。

    这种情况下,应该将这个键插入到列表索引-i-1的位置上,以保持列表的有序性

3.简单算法:

3.1java.util.Collections 1.2:

    static <T extends Comparable<? super T>> T min(Collection<T> elements)

    static <T extends Comparable<? super T>> T max(Collection<T> elements)

    static <T> min(Collection<T> elements , Comparator<? super T> c)

    static <T> max(Collection<T> elements , Comparator<? super T> c)

    返回集合中最小的或最大的元素(为清楚起见,参数的边界被简化了)

    static <T> void copy(List<? super T> to , List<T> from)

    将原列表中的所有元素复制到目标列表的相应位置上。目标列表的长度至少与原列表一样

    static <T> void fill(List<? super T> l , T value)

    将列表中的所有位置设置为相同值

    static <T> boolean addAll(Collection<? super T> c , T... values) 5.0

    将所有的值添加到集合中,如果集合改变了则返回true

    static <T> boolean replaceAll(List <T> l , T oldValue , T newValue) 1.4

    用newValue取代所有值为oldValue的元素

    static int indexOfSubList(List <?> l , List<?> s) 1.4

    static int lastIndexOfSubList(List<?> l , List<?> s) 1.4

    返回l中第一个或者最后一个等于s子列表的索引。如果l中不存在等于s的子列表,则返回-1.

    static void swaq(List<?> l, int i, int j) 1.4

    交换给定偏移量的两个元素

    static void reverse(List<?> l)

    逆置列表中元素的顺序

    static void rotate(List<?> l, int d) 1.4

    旋转列表中的元素,将索引i的条目移动到位置(i+d)%l.size()

    static int frequency(Collection<?> c1 , Collection<?> c2) 5.0

    返回c中与对象o相同的元素个数

    boolean disjoint(Collection<?> c1 , Collection<?> c2) 5.0

    如果两个集合没有共同元素,则返回true

3.2java.util.Collection<T> 1.2:

    default boolean removeIf(Predicate<? super E> filter) 8

    删除所有匹配的元素

3.3java.util.List<E> 1.2

   default void replaceAll(UnaryOperator<E> op) 8

   对这个列表的所有元素应用这个操作

4.批处理:

很多操作会“成批”复制或者删除元素,例如removeAll(...)等等,其实最好是对视图进行操作,这样既能够很好的完成任务,也能够界定范围。

5.集合与数组的转换:

如果需要把一个数组转换为集合,ArrayList.asList包装器可以达到这个目的

String[] values = ...;

HashSet<String> staff = new HashSet<>(ArrayList.asList(values));

从集合得到数组会更加困难一些。当然,可以使用toArray方法:

Object[] values = staff.toArray();

不过,这样的结果是一个Object数组还不能够强制转换,所以稍微改变一下:

String[] values = staff.toArray(new String[0]);

猜你喜欢

转载自blog.csdn.net/qq_38386085/article/details/81318192