我希望能夠實作某種類或變數,可以用Java在里面存盤可能的許多ArrayLists。
例如,一個二維的 ArrayList 將是這樣的。ArrayList<ArrayList<Data_type>>.
。一個三維的ArrayList是這樣的 ArrayList<ArrayList<ArrayList<Data_type>>.
以此類推,任何N個大小的ArrayList。
我想實作一個可以接受任何N個大小的陣列串列作為引數的函式,我不太確定如何實作,以及函式簽名會是什么樣子。我目前正在嘗試使用過去曾使用過的泛型,但在這種情況下,我有點迷茫。
有什么建議嗎?
uj5u.com熱心網友回復:
一種方法是創建一個Container類,其中有一個包裝好的值或者一個帶有值的串列:
class Container< T> {
private boolean isSingleElement;
private T值。
private List<Container<T>> list。
}
然后你可以添加這些建構式和靜態工廠方法。它們能夠創建容器。
private Container(T value){
this.value = value。
this.isSingleElement = true;
}
private Container(List<Container<T> > values) {
this.list = Collections.unmodifiableList(values)。
this.isSingleElement = false;
}
public static <T> Container<T> ofSingle(T值) {
return new Container<>(value)。
}
public static <T> Container<T> ofList(List< T> list) {
return new Container<> (list.stream()
.map(Container::new)
.toList())。)
}
然后你可以添加方法來檢索容器中的資訊:
public boolean isSingleElement() {
return isSingleElement。
}
public T value() {
if (!isSingleElement) {
throw new IllegalArgumentException()。
}
return value。
}
public List<Container<T>> list() {
if (isSingleElement) {
throw new IllegalArgumentException()。
}
return串列。
}
注意list()和value()方法都拋出IllegalArgumentException,如果容器包含一個單一元素或一個串列。這樣做的缺點是,如果呼叫了錯誤的方法,這將導致在運行時拋出一個錯誤。
如果你愿意,你也可以完全洗掉value()方法,并將單個元素包裝成一個串列:
public List<Container<T>> list() {
if (isSingleElement) {
return List.of(new Container<>(value))。
}
else {
return list;
}
}
uj5u.com熱心網友回復:
在這個時候,你可以創建一個回圈和遞回,同時檢查獲得的物件是否是ArrayList,如果是ArrayList,再做一次遞回。下面是一個例子
//假設我有一個ArrayList<ArrayList<ArrayList<String>>/span>
/**。
* @param ArrayList<? >
*列印出ArrayList中存在的所有ArrayList中的所有值
*/
public static void printArrayItems(ArrayList<?> a) {
a.forEach((e) -> {
if(e instanceof ArrayList) printArrayItems((ArrayList) e); else System.out.println(e)。
});
uj5u.com熱心網友回復:
添加了通用性是為了有更好的型別安全的代碼。但是如果你不知道維度,你就不能使用嵌套的ArrayLists創建一個型別安全的N維結構。
也許你可以使用一個扁平化的結構,將坐標映射到值。
Map<List<Integer>, DataType> twoDimensionalMap = Map.of(
List.of(0,0), value00,
List.of(0,1), value01,
List.of(1,0), value10。
List.of(1,1) , value11
)
Map<List<Integer>, DataType> threeDimensionalMap = Map.of(
List.of(0,0,0), value000。
List.of(0,0,1), value001。
List.of(0,1,0), value010,
List.of(0,1,1), value011。
...
)
這不是完全的型別安全,因為沒有檢查所有的坐標是否是相同的長度,也沒有檢查所有的坐標是否被填入,但是對于某些用例,這是一個可行的解決方案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/329335.html
標籤:
上一篇:圍繞影像中的特定物件進行飄動裁剪
