在数组(序列、有序集合)中查找特定数组
来源:互联网 发布:手机办公必备软件 编辑:程序博客网 时间:2024/04/30 07:03
在数组(序列、有序集合)中查找特定数组
java API中的查找只是一些简单的查找,比如在数组中查找某个元素,或者在字符串中查找某段字符串,这些基本的用法实际上已经差不多够用了,但是一些比较复杂一点的查找目前还没有,比如想要在数组(序列、有序集合)中查找特定数组(序列、有序集合),就没有对应的方法,最近有这个需求,因此琢磨了一下,写出来了。
其实也没多难,就是参照了String.indexOf(String)的方法写的,因为字符串某种意义上说也是数组,因此仿照这个方法自己写了个查找类,实现
- ArrayList中查找ArrayList
- Object[]中查找Object[]
由此也可以衍生出其他的需求,可以根据情况修改
将代码疯转在一个SeleteUtils里面,代码如下:
import java.util.ArrayList;
/**
* 用于查找的工具类
*/
public class SelectUtils {
/** * 用于在list中查找特定的list * * @param containerList 在哪个list中查找特定的list * @param targetList 需要查找的list * @param <T> * @return list在container中的索引值,如果不存在则返回-1 */public static <T> int indexOfList(ArrayList<T> containerList, ArrayList<T> targetList) { // 先转移数据,避免影响原先的数据,注意如果直接赋值,只是给了引用 ArrayList<T> container = new ArrayList<T>(); container.addAll(containerList); ArrayList<T> target = new ArrayList<T>(); target.addAll(targetList); if (target.size() > 0) { if (target.size() > container.size()) { return -1; } //针对{1,2,3,2,3,4}中查找{2,3,4}第一次出现23的时候不符合但不能终止查找,所以要继续 while (true) { T firstChar = target.get(0); // 从第一个匹配到的位置开始查找 int i = container.indexOf(firstChar); if (i == -1 || target.size() + i > container.size()) { return -1; } int o1 = i, o2 = 0; while (o1 < container.size() && o2 < target.size()) { if (!(container.get(o1).equals(target.get(o2)))) { break; } o1++; o2++; } if (o2 == target.size()) { return i; } //如果这一次查找失败,需要将前面查找过的数据移除 for (int j = 0; j < (i + 1); j++) { container.remove(0); } } } return -1;}/** * 用于在数组中查找特定的数组 * * @param container 在哪个数组中查找特定的数组 * @param target 需要查找的数组 * @return target在container中的索引值,如果不存在则返回-1 */public static int indexOfArray(Object[] container, Object[] target) { int start = 0; if (target.length > 0) { if (target.length > container.length) { return -1; } // 针对{1,2,3,2,3,4}中查找{2,3,4}第一次出现23的时候不符合但不能终止查找,所以要继续 while (true) { // 从第一个匹配到的位置开始查找 for (; start < container.length; start++) { if (container[start].equals(target[0])) break; } if (start == container.length || target.length + start > container.length) { return -1; } int o1 = start, o2 = 0; while (o1 < container.length && o2 < target.length) { if (!(container[o1].equals(target[o2]))) { break; } o1++; o2++; } if (o2 == target.length) { return start; } start++; } } return -1;}
}
调用示例
ArrayList<Integer> a = new ArrayList<Integer>(); a.add(1); a.add(2); a.add(3); a.add(4); ArrayList<Integer> b = new ArrayList<Integer>(); b.add(2); b.add(3); int y = SelectUtils.indexOfList(a, b); System.out.println("y:" + y);
数组的也是类似,不举例了,希望对大家有帮助~~~
0 0
- 在数组(序列、有序集合)中查找特定数组
- 在一个循环有序的数组里查找特定值
- 查找有序二维数组中是否包含特定值
- 二分法在有序数组中进行查找
- 在查找有序二维数组中查找元素
- 二维有序数组中查找
- 有序二维数组中查找
- 二维有序数组中查找
- 折半查找,也称二分查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。
- 在特定规律的数组中查找某元素
- 在一个两段有序的数组中查找
- 在有序递增数组中查找一个缺少的数字
- 3 - 在有序二维数组中查找元素
- 在部分有序数组中查找定值
- 在部分有序数组中查找定值2
- 在有序但含有空的数组中查找字符串
- 在有序但含有空的数组中查找字符串
- 在一个有序的旋转数组中,查找给定值
- canvas.save() canvas.restore() 解析
- JVM垃圾回收分代机制及性能调优
- c#解压
- 约瑟夫问题
- TabLayout使用
- 在数组(序列、有序集合)中查找特定数组
- 推荐系统常用数据集
- MVC,MVP 和 MVVM 的图示
- EventBus使用之基础
- java poi导出Excel表格超大数据量解决方案
- 一、MyBatis简单入门
- Android 服务器之更新
- imageView scaleType的值 各种解释
- 使用FastReport-v5.3.17把fp3文件转为excel文件