簡體   English   中英

Java:可變長度參數作為遞歸列表

[英]Java: variable length parameters as list for recursion

我想要以下遞歸方法:

private Node getElementRec(Node currentNode, String ... names) {
    if (null == names || names.length == 0)
        return currentNode;
    else {
        Node child = currentNode.getChildWithName(names[0]);
        return getElementRec(child, namesAux.subList(1, names[1,]));
    }
}

由於可變長度 Java 參數(此處names )是 arrays,我無法制作類似names.sublist(1, names.size())之類的東西 雖然效率很低,但我嘗試將數組轉換為列表然后傳遞它到方法,但它不接受列表

所以問題是:在 Java 中是否可以對可變長度參數(Type... parameter)進行遞歸? 像我展示的那樣是可能的嗎?

謝謝

您可以使用 Arrays class 中的 copyOfRange function 來傳遞給 ZC1C425268E68389D1AB4A70

Arrays.copyOfRange(names, 1, names.length)

避免復制的另一種方法是修改您的 function 以接受開始和結束索引:

private Node getElementRec(Node currentNode, int start, int end, String ... names) {
    if (null == names || start >= end || start < 0 || end > names.length)
        return currentNode;
    else {
        Node child = currentNode.getChildWithName(names[start]);
        return getElementRec(child, start+1, end, names);
    }
}

您可以使用names.length而不是names.size()
Varags ... java 中的變量是 arrays,而不是您建議的向量。

String... namesString[] names的簡寫。 所以你可以試試:

else {
     Node child = currentNode.getChildWithName(names[0]);
     String[] remainingNames = new String[names.length -1];
     System.arrayCopy(names, 1, remainingNames, 0, names.length - 1);
     return getElementRec(child, remainingNames));
 }

通過索引

private Node getElementRec(Node currentNode, int i, String ... names) {
    if (null == names || names.length == i)
        return currentNode;
    else {
        Node child = currentNode.getChildWithName(names[i]);
        return getElementRec(child, i+1, names);
    }
}

您可以傳遞數組來代替可變參數:

private Node getElementRec(Node currentNode, String ... names) {
     String slice[] = ..... // Get sub array from names
     ....
     getElementRec(node, slice);
     ....
}

首先:可變參數是使用List實現的,而不是作為向量(向量通常表示java.util.Vector在 Java 中的subList()

正如您所意識到的,collections(特別是List對象)允許比簡單的 arrays 更豐富的交互。 幸運的是,有一種簡單的方法可以使用Arrays.asList()將數組轉換為List

我將使用List<String>而不是String...來實現遞歸方法,提供一個采用可變參數的便捷方法:

private Node getElementRec(Node currentNode, String... names) {
    return getElementRec(currentNode, Arrays.asList(names));
}

private Node getElementRec(Node currentNode, List<String> names) {
    if (null == names || names.isEmpty())
        return currentNode;
    else {
        Node child = currentNode.getChildWithName(names.get(0));
        return getElementRec(child, names.subList(1, names.length()-1));
    }
}

暫無
暫無

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

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