आप या तो कर सकते हैं:
TSTNode
(यानी, यह कर से <T>
प्रकार पैरामीटर को दूर गैर-जेनेरिक) - इसके पास अभी भी बाहरी <T>
तक पहुंच होगी।
<T>
TSTNode
में U
में टाइप पैरामीटर का नाम बदलें।
[अद्यतन]
नीचे अपने कोड के पुनर्लेखन के लिए चार अलग-अलग तरीके हैं। वे सभी संकलित करते हैं। मुझे लगता है कि आपको EnumMap
के उपयोग पर विचार करना चाहिए (नीचे संस्करण 4 देखें)।
संस्करण 1: आंतरिक वर्ग में एक अलग नामित प्रकार पैरामीटर का उपयोग करें। आपको सरणी के बजाय सूची का उपयोग करने की आवश्यकता है।
public class TernarySearchTree<T> {
protected class TSTNode<U> {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected List<TSTNode<U>> relatives;
private U data;
protected TSTNode(char splitchar, TSTNode<U> parent) {
this.splitchar = splitchar;
relatives = new ArrayList<TSTNode<U>>();
for (int i = 0; i < HIKID; ++i) { // Allocate 4 slots in relatives
relatives.add(null);
}
relatives.set(PARENT, parent);
}
}
private TSTNode<T> node; // When you use it, pass T as U
public TernarySearchTree() {
node = new TSTNode<T>(',', null); // When you use it, pass T as U
}
}
संस्करण 2: वर्ग enclosing से विरासत टी
public class TernarySearchTree<T> {
protected class TSTNode {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected List<TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
relatives = new ArrayList<TSTNode>();
for (int i = 0; i < HIKID; ++i) { // Allocate 4 slots in relatives
relatives.add(null);
}
relatives.set(PARENT, parent);
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
संस्करण 3: (क सूची के बजाय) एक मानचित्र का उपयोग
public class TernarySearchTree<T> {
protected class TSTNode {
// index values for accessing relatives array:
protected static final int PARENT = 0, LOKID = 1, EQKID = 2, HIKID = 3;
protected char splitchar;
protected Map<Integer, TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
// Create a hash map. No need to pre-allocate!
relatives = new HashMap<Integer, TSTNode>();
relatives.put(PARENT, parent); // set -> put
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
}
संस्करण 4: सूचकांक को एक enum के रूप में परिभाषित करें + एक EnunMap का उपयोग करें (एक हैश एम के बजाय पी)
public class TernarySearchTree<T> {
protected static enum Index {
PARENT, LOKID, EQKID, HIKID;
}
protected class TSTNode {
protected char splitchar;
protected EnumMap<Index, TSTNode> relatives;
private T data;
protected TSTNode(char splitchar, TSTNode parent) {
this.splitchar = splitchar;
// Create an EnumMap.
relatives = new EnumMap<Index, TSTNode>(Index.class);
relatives.put(Index.PARENT, parent);
}
}
private TSTNode node;
public TernarySearchTree() {
node = new TSTNode(',', null);
}
}
[अपडेट 2] को ध्यान में रखना एक बात: Use EnumMap instead of ordinal indexing
आप एक संकलन त्रुटि मिलती है, तो आप ** को शामिल करना चाहिए ** संकलन त्रुटि आपके प्रश्न में संदेश! लेकिन यह मेरे लिए ठीक काम करता है। बस सुनिश्चित करें कि आप 'रिश्तेदारों' के * घोषणा * पर '' से छुटकारा पाएं। उस ने कहा, आप हमेशा 'टीएसटीएनओडी' स्थिर बना सकते हैं और 'ई' जैसे एक अलग पैरामीटर का उपयोग कर सकते हैं। –
जेनेरिक सरणी बनाने के लिए क्यों संभव नहीं है: http://stackoverflow.com/questions/2927391/whats-the-reason-i-cant-create-generic-array-types-in-java –
क्या TSTNode को एक्सेस करने की आवश्यकता है उदाहरण फ़ील्ड या TernarySearchTree से तरीकों? –