[英]Creating and array of E in Generic SortedSet
作為示例,我正在用Java開發一個簡單的MySortedSet<E>
,該實現了SortedSet<E>
接口。 它由一個簡單的數組E[] array
備份。
我對此有幾個疑問:
此類是這樣的:(我沒有寫完整的代碼,而不是相關部分)
public class MySortedSet<E> implements SortedSet<E>, Iterator<E> {
private E[] array;
private Comparator<? super E> _comparator;
private int size = 0;
private int capacity;
@SuppressWarnings("unchecked")
public MySortedSet() {
this.capacity = 10;
this.array = (E[]) new Object[this.capacity];
// this.array = Array.newInstance(Class<E> var,int size);
// We have to get Class<E> from outside caller.
}
}
問題1:有人可以告訴我,是否有更好的方法在構造函數中創建一個新數組,而不是this.array = (E[]) new Object[this.capacity];
ArrayList<E>
將元素存儲在一個簡單的Object[]
,原始值會自動裝箱,並為刪除的元素留下的孔分配null
。
實現Comparable<E>
必須實現int compareTo(E other)
,它與Comparator
compare(E o1, E o2)
類似。 您可以檢查內部比較器是否為null
然后返回對象的自然順序,也可以定義內部“使用自然順序”比較器實現。
二進制搜索是一種使定位某項或將某項應插入排序列表中的位置所需的比較次數最小化的方法。 無需檢查每個元素從第一個元素開始,而是從列表的中點開始。 如果要搜索的物品應該在找到的元素之前,則向前移動一半並重復; 否則,將其移到最后一半並重復。 每次重復時,都將先前的下/上限和中點用作新的子列表,從而將每個步驟中的元素數量減半。
考慮嘗試猜測1到100之間的數字,每次告訴您猜測的是太高還是太低。
您應該繼續執行此處的操作,或者將其保留為Object[]
並在輸出它們時強制轉換值。 (例如, ArrayList
實現就是后者。)
您可以更改代碼以刪除不安全的演員表:
public MySortedSet(Class<E> clazz) {
capacity = 10;
array = Array.newInstance(clazz, capacity);
}
盡管它強制客戶端代碼提供Class<E>
對象,但這是用於解決此類問題(在構造函數中需要有類型的Class
對象)的一種非常常見的代碼模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.