Câu hỏi của bạn thực sự khiến tôi nghĩ đến việc khiến lớp học này xử lý một thứ như vậy. Tôi hiện đang làm việc trên một công cụ trò chơi 2D và câu hỏi của bạn hoàn toàn làm cho tôi nghĩ về chính xác những gì tôi cần.
Bằng cách bạn đã đọc nó, tôi tin những gì bạn muốn là;
Một đối tượng chứa khóa và giá trị, nhưng bạn cũng có thể giữ các giá trị khóa chung (tôi sử dụng đối tượng này đặc biệt để cắt giảm cpu với chi phí sử dụng bộ nhớ nhiều hơn một chút.)
Loại này 'Loại K là loại khóa chính. Kiểu T là kiểu giá trị HashSet.
Cách bạn thực hiện và sử dụng đối tượng này là:
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);
}
Bạn sẽ cần phải giữ các thẻ duy nhất trong một tập hoặc ArrayList trong bất kỳ lớp học mà bạn thực hiện điều này vì nếu bạn trai tôi Bạn không được lưu trữ các thực thể và không biết thực thể nào. Vì vậy, lưu trữ các số nguyên bạn nhận được từ phương thức put() vào một arraylist hoặc set, và lặp qua đó.
Bạn có thể kiểm tra giá trị của Lớp này nếu chúng tồn tại hoặc đối tượng khóa nào được đặt thành giá trị.
Đây là lớp 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;
}
}
Bạn có vô tình đảo ngược câu hỏi của mình không? Vì bạn cho biết "... Bản đồ cho phép một khóa truy cập nhiều giá trị", không đúng với giao diện Bản đồ. Đó là một một ánh xạ giữa khóa và giá trị (mặc dù, tất nhiên, giá trị của bạn có thể là một bộ sưu tập) – Falaina
Khi bạn nói * "thường xuyên thay đổi đối tượng này" * bạn có ý nghĩa gì? Bạn có nghĩa là đối tượng là có thể thay đổi và bạn thay đổi trạng thái của nó? Hoặc bạn có nghĩa là bạn cần phải thay thế một ánh xạ với một ánh xạ khác (và thay thế cho mỗi khóa được liên kết)? –