簡體   English   中英

如何從通用列表遞歸獲取范圍內的所有元素?

[英]How can I get all elements in range from a generic List recursively?

給定一個通用類型列表(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時,我得到了“索引超出范圍異常”或“堆棧溢出錯誤”。

一種使用分而治之范式的可能解決方案

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來進行計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM