अपना प्रश्न वास्तव में मुझे इस वर्ग ऐसी बात को संभालने के लिए बनाने के बारे में सोच मिला है। मैं वर्तमान में 2 डी गेम इंजन पर काम कर रहा हूं और आपके प्रश्न ने मुझे पूरी तरह से सोचने के लिए बनाया है कि मुझे क्या चाहिए।
जिस तरह से आपने इसे लिखा है, मुझे विश्वास है कि आप क्या चाहते हैं;
एक ऑब्जेक्ट जिसमें कुंजी और मान होते हैं, लेकिन आप सामान्य कुंजी मान भी प्राप्त कर सकते हैं (मैं इस ऑब्जेक्ट का उपयोग विशेष रूप से थोड़ी अधिक स्मृति का उपयोग करने के लिए सीपीयू पर कटौती करने के लिए करता हूं।)
इस कक्षा का के प्रकार प्राथमिक कुंजी प्रकार है। टी प्रकार हैशसेट वैल्यू टाइप है।
जिस तरह से आप को लागू करने और इस वस्तु का उपयोग करें:
MapValueSet<ObjectType1,ObjectType2> mainmap = new
MapValueSet<ObjectType1,ObjectType2>()
HashSet<Integer> tags = new HashSet<Integer>();
public void test(){
ObjectType1 = new ObjectType1();
ObjectType2 = new ObjectType2();
tags.add(mainmap.put(ObjectType1,ObjectType2);
mainmap.get(ObjectType1,Integer);
}
आप इस क्योंकि अगर आप नहीं था लागू है आप किसी भी कक्षा में एक सेट या ArrayList में अद्वितीय टैग धारण करने के लिए की आवश्यकता होगी आप संस्थाओं को संग्रहित नहीं करेंगे और नहीं जानते कि कौन सा था। तो Put() विधि से प्राप्त सरणी को सरणीसूची में सेट करें या सेट करें, और उसके माध्यम से पुनरावृत्त करें।
यदि आप मौजूद हैं, तो आप इस कक्षा के मूल्यों की जांच कर सकते हैं, या किस कुंजी ऑब्जेक्ट को सेट किया गया है।
क्लास MapValueSet यहां है;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
public class MapValueSet<K,T> {
Indexer indxK = new Indexer();
Indexer indxT = new Indexer();
Map<K,Integer> kTags = new HashMap<K,Integer>();
Map<T,Integer> tTags = new HashMap<T,Integer>();
Map<Integer,HashSet<Integer>> MapK = new HashMap<Integer,HashSet<Integer>>();
Map<Integer,HashSet<Integer>> MapT = new HashMap<Integer,HashSet<Integer>>();
public int put(K k, T t){
int tag = -1;
if(!kTags.containsKey(k)){
kTags.put(k, indxK.getNextTag());
}
if(!MapK.containsKey(kTags.get(k))){
MapK.put(kTags.get(k), new HashSet<Integer>());
}
if(!tTags.containsKey(t)){
tTags.put(t, tag = indxT.getNextTag());
}
if(!MapT.containsKey(tTags.get(t))){
MapT.put(tag = tTags.get(t), new HashSet<Integer>());
}
MapK.get(kTags.get(k)).add(tTags.get(t));
MapT.get(tag = tTags.get(t)).add(kTags.get(k));
return tag;
}
@SuppressWarnings("unchecked")
public T get(K k, int tag){
Object[] tArr = tTags.keySet().toArray();
for(int i = 0; i < tArr.length; i++){
if(tTags.get((T)tArr[i])== tag){
return (T)tArr[i];
}
}
return null;
}
public boolean removeAtKey(K k, T t){
int kTag = -1;
int tTag = -1;
if(kTags.get(k) != null){
kTag = kTags.get(k);
}
if(tTags.get(t) != null){
tTag = tTags.get(t);
}
if(kTag == -1 || tTag == -1){
System.out.println("Keys are Blank at: removeAtKey(k,t)");
return false;
}
boolean removed = false;
if(MapK.get(kTag) != null){
removed = MapK.get(kTag).remove(tTag);
}
if(MapT.get(tTag) != null){
MapT.get(tTag).remove(kTag);
}
if(!MapK.containsKey(kTag)){
kTags.remove(k);
indxK.removeTag(kTag);
}
if(MapK.containsKey(kTag)){
tTags.remove(t);
indxT.removeTag(tTag);
}
return removed;
}
public void removeAtValue(T t){
if(!tTags.containsKey(t)){
return;
}
Object[] keyArr = MapT.get(tTags.get(t)).toArray();
for(int i = 0; i < keyArr.length; i++){
MapK.get(keyArr[i]).remove(tTags.get(t));
}
indxT.removeTag(tTags.get(t));
MapT.remove(tTags.get(t));
tTags.remove(t);
}
public boolean mapContains(T t){
if(tTags.get(t) == null){
return false;
}
int tTag = tTags.get(t);
return MapT.get(tTag) != null && !MapT.get(tTag).isEmpty();
}
public boolean containsKey(K k){
if(kTags.get(k) == null){
return false;
}
return MapK.containsKey(kTags.get(k));
}
public boolean keyContains(K k, T t){
if(kTags.get(k) != null && tTags.get(t) != null){
return MapK.get(kTags.get(k)).contains(tTags.get(t));
}
return false;
}
@Override
public String toString(){
String s = "";
s = s+ "Key Map: " + MapK.toString() + "\n";
s = s+ "Value Map: " + MapT.toString() + "\n";
s = s+ "KeyTag Map: " + kTags.toString() + "\n";
s = s+ "ValueTag Map: " + tTags.toString() + "\n";
s = s+ "KeyTag List: " + indxK.activeSet().toString() + "\n";
s = s+ "ValueTag List: " + indxT.activeSet().toString();
return s;
}
}
क्या आपने दुर्घटना से अपने प्रश्न को उलट दिया? क्योंकि आप "... नक्शा एकाधिक मानों तक पहुंचने के लिए एक कुंजी के लिए अनुमति देता है", जो मानचित्र इंटरफ़ेस के बारे में सच नहीं है। यह कुंजी और मूल्य के बीच एक मैपिंग में से एक है (हालांकि, ज़ाहिर है, आपका मूल्य संग्रह हो सकता है) – Falaina
जब आप कहते हैं * "इस ऑब्जेक्ट में लगातार बदलाव" * आपका क्या मतलब है? क्या आपका मतलब है कि वस्तु उत्परिवर्तनीय है और आप इसकी स्थिति बदलते हैं? या क्या आपका मतलब है कि आपको एक मैपिंग को दूसरे के साथ प्रतिस्थापित करने की आवश्यकता है (और प्रत्येक संबंधित कुंजी के लिए प्रतिस्थापित करें)? –