【问题标题】:How can I get all elements in range from a generic List recursively?如何递归地从通用列表中获取范围内的所有元素?
【发布时间】:2020-03-22 18:27:46
【问题描述】:

给定一个泛型类型列表(List),以及两个泛型类型对象:a,b:

-设计一种算法,该算法返回一个列表,该列表包含原始列表中属于范围 [a,b) 的每个元素。

-算法必须包含比较器E。

-解决方案必须是“分而治之”的算法。

这是我想出的:

private static <E extends Comparable<E>> List <E> Dominio(List<E> lista, E a, E b){

    return DominioAux(lista,a,b,0,lista.size()-1);
}

private static <E extends Comparable<E>> List <E> DominioAux(List<E> lista, E a, E b,Integer i, Integer j){

    List<E> res = new ArrayList<>();
    Integer m = (j-i)/2;
    E pm = lista.get(m);

    if (pm == a) {
        DominioAux(lista,a,b,m,j);
    } else if(pm==b) {
        DominioAux(lista,a,b,i,m-1);
    }

    if (pm.compareTo(a)<0) {
        res = DominioAux(lista,a,b,m,j);
    }   

    if (pm.compareTo(a)>0) {
        res = DominioAux(lista,a,b,i,m);
    }

    res = lista.subList(i, j);
    return res;     
}

问题是当执行其中一个 if 时,我要么得到“索引越界异常”,要么得到“堆栈溢出错误”。

【问题讨论】:

    标签: java list generic-list divide-and-conquer generic-type-argument


    【解决方案1】:

    使用分而治之范式的一种可能解决方案

    private static <E extends Comparable<E>> List <E> DominioAux(List<E> lista, E a, E b,Integer i, Integer j){
        List<E> res = new ArrayList<>();
    
        if(i >= j) { //Check if the value of list[i] is in the range [a,b)
            if (lista.get(i).compareTo(a) >= 0 && lista.get(i).compareTo(b) < 0) {
                res.add(lista.get(i));
            }
    
            return res;
        }
    
        Integer m = (i + j) / 2;
        List<E> list1 = DominioAux(lista, a, b, i, m);
        List<E> list2 = DominioAux(lista, a, b, m + 1, j);
    
        res.addAll(list1);
        res.addAll(list2);
    
        return res;
    }
    

    您的方法中的一个错误是在计算 m 时,如果 i 和 j 则 m 应该是中间值,那么要计算它,您必须将 i 和 j 相加,而不是从 j 中减去 i

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多