Collections工具类学习

news/2024/11/15 2:03:19/

1.二分查找

 public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key) {//  List<比较器> list , 元素if (list instanceof RandomAccess || list.size()<BINARYSEARCH_THRESHOLD)return Collections.indexedBinarySearch(list, key);elsereturn Collections.iteratorBinarySearch(list, key);}

// 下标比较法 直接将下标带入

 private static <T>int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {int low = 0;int high = list.size()-1;while (low <= high) {int mid = (low + high) >>> 1;Comparable<? super T> midVal = list.get(mid);int cmp = midVal.compareTo(key);if (cmp < 0)low = mid + 1;else if (cmp > 0)high = mid - 1;elsereturn mid; // key found}return -(low + 1);  // key not found}

迭代器比较法 每次都得去迭代器中找到元素

int iteratorBinarySearch(List<? extends Comparable<? super T>> list, T key)
{int low = 0;int high = list.size()-1;ListIterator<? extends Comparable<? super T>> i = list.listIterator();while (low <= high) {int mid = (low + high) >>> 1;Comparable<? super T> midVal = get(i, mid);int cmp = midVal.compareTo(key);if (cmp < 0)low = mid + 1;else if (cmp > 0)high = mid - 1;elsereturn mid; // key found}return -(low + 1);  // key not found
}

区别,一个通过下标找,一个通过迭代器遍历找

2.反转
这个直接就是互相交换,没什么说的

  public static void reverse(List<?> list) {int size = list.size();if (size < REVERSE_THRESHOLD || list instanceof RandomAccess) {for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--)swap(list, i, j);} else {// instead of using a raw type here, it's possible to capture// the wildcard but it will require a call to a supplementary// private methodListIterator fwd = list.listIterator();ListIterator rev = list.listIterator(size);for (int i=0, mid=list.size()>>1; i<mid; i++) {Object tmp = fwd.next();fwd.set(rev.previous());rev.set(tmp);}}}

3.顺序随机分配(洗牌)

public static void shuffle(List<?> list) {Random rnd = r;if (rnd == null)r = rnd = new Random(); // harmless race.shuffle(list, rnd);
}public static void shuffle(List<?> list, Random rnd) {int size = list.size();if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {for (int i=size; i>1; i--)//每个数都得尝试动一次swap(list, i-1, rnd.nextInt(i));} else {Object[] arr = list.toArray();// Shuffle arrayfor (int i=size; i>1; i--)swap(arr, i-1, rnd.nextInt(i));// Dump array back into list// instead of using a raw type here, it's possible to capture// the wildcard but it will require a call to a supplementary// private methodListIterator it = list.listIterator();for (Object e : arr) {it.next();it.set(e);}}}

4.数据交换

public static void swap(List<?> list, int i, int j) {// instead of using a raw type here, it's possible to capture// the wildcard but it will require a call to a supplementary// private methodfinal List l = list;l.set(i, l.set(j, l.get(i)));//这里  因为set返回的是之前的值,l.set(j, l.get(i)) 这个返回的,就是之前放在index = j的值//很妙,用返回值作为参数嵌套
}E set(int index, E element);//
Inserts the specified element at the specified position in this list (optional operation). Shifts the element currently at that position (if any) and any subsequent elements to the right (adds one to their indices).
在此列表中的指定位置插入指定的元素(可选操作)。将当前位于该位置的元素(如果有)和任何后续元素向右移动(在其索引中添加一个)Inserts the specified element at the specified position in this list (optional operation). Shifts the element currently at that position (if any) and any subsequent elements to the right (adds one to their indices).

http://www.ppmy.cn/news/570507.html

相关文章

【C/C++】使用类和对象 封装链表

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

C++ 标准库 — 正则表达式 std::regex

C 标准库 — 正则表达式 std::regex 文章目录 C 标准库 — 正则表达式 std::regexI - 正则表达式概述II - 内容2.1 - 匹配字符2.2 - 匹配数量/次数2.3 - 特殊字符的用途 III - 使用3.1 - 正则表达式有不止一种写法3.2 - 内置通用字符簇特殊用法3.3 - 元字符使用3.4 - 零宽断言3…

web的get请求中一个key有多个value值的情况如何处理,qs的工具的使用

利用qs库 qs是一个流行的查询参数序列化和解析库。 可以将一个普通的object序列化成一个查询字符串&#xff0c;或者反过来将一个查询字符串解析成一个object&#xff0c;而且支持复杂的嵌套。 并且天然支持urlcode的编码和解码。非常的实用 至于http为什么需要这个URLcode的编…

伺服生产方案埃斯顿伺服

伺服生产方案埃斯顿伺服 id570658019967&

台达DVP ES系列PLC与台达MS300变频器通讯程序

台达DVP ES系列PLC与台达MS300变频器通讯程序 器件&#xff1a;台达DVP ES系列的PLC&#xff0c;台达MS300系列变频器&#xff0c;昆仑通态&#xff0c;威纶通 功能&#xff1a;实现频率设定&#xff0c;启停控制&#xff0c;实际频率读取等。 资料&#xff1a;带注释PLC程序&a…

威科达追剪专用型伺服驱动器

VEC-VC-F追剪专用型伺服内含自动追剪控制功能&#xff0c;随着加工物的进料速度&#xff0c;自动控制锯台前进速度&#xff0c;在达到设定长度时&#xff0c;进入同步区发出可裁切信号&#xff0c;将加工物锯断后发出裁切完成信号&#xff0c;锯台快速返回原点准备下一次裁切。…

帝特dt 5001/5002/5003驱动

帝特dt 5001/5002/5003驱动是官方提供的一款USB驱动&#xff0c;本站收集提供高速下载&#xff0c;用于解决USB接口不能正常识别&#xff0c;无法正常使用的问题&#xff0c;本动适用于&#xff1a;Windows XP / Windows 7 / Windows 8 / Windows 10 32/64位操作系统。有需要的…

步进电机驱动器一体机VSMD122_025T(北京伟恩斯技术有限公司)使用方法

简介 VSMD122_025T是运动控制和电机驱动一体化的步进电机闭环控制驱动模块。VSMD122_025T使用RS232串口总线。输入电压为12~40VDC。 串口模块 我们使用的是六合一多功能串口模块&#xff08;CP2102&#xff09;。 我们使用的是第二种模式。 电机驱动模块与串口模块接线…