在数组(序列、有序集合)中查找特定数组

来源:互联网 发布:手机办公必备软件 编辑:程序博客网 时间: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
原创粉丝点击