如果您在多次尋找其尋找最優的運行時性能將含有特定的屬性值,那麼您可能需要使用數據庫(或內存中的一個)或手動非標準化數據,這樣你保持爲每個屬性列表的圖,由其值鍵控。 請注意,此解決方案是唯一值得的,如果這些查找足夠頻繁,表現足以關鍵,以保證數據的重複成本。
E.g.
// aSets is a map to a list of all the sets which have
// a specified value for field "_A" (values being the map key)
Map<String, List<Set<MyObject>>> aSets;
Map<String, List<Set<MyObject>>> bSets;
...
這並不理想,但它提供了所需的查找。
編寫一個索引器類並不難,因爲它使用對所提供集合的基礎對象的反射自動創建這些映射。我寫了一些代碼,做這樣的事情前一段時間作爲一個概念的東西或其他證明。從未使用過它,但保留了它身邊......這是註釋掉和使用您自己的風險(和它不會對集合書面工作,但會很容易地修改):
public class Indexer
{
private Map<String,Map<Object,Set<Object>>> index = new HashMap<String,Map<Object,Set<Object>>>();
public void add(Object object) throws Exception
{
BeanInfo info = Introspector.getBeanInfo(object.getClass());
PropertyDescriptor[] propertyDescriptors = info.getPropertyDescriptors();
for (PropertyDescriptor descriptor : propertyDescriptors)
{
String fieldName = descriptor.getName();
Map<Object,Set<Object>> map = index.get(fieldName);
if (map == null)
{
map = new HashMap<Object,Set<Object>>();
index.put(fieldName, map);
}
Method method = descriptor.getReadMethod();
Object data = method.invoke(object);
Set<Object> set = map.get(data);
if (set == null)
{
set = new HashSet<Object>();
map.put(data, set);
}
set.add(object);
}
}
public Set<Object> get(String fieldName, Object value)
{
Map<Object,Set<Object>> map = index.get(fieldName);
if (map != null)
{
Set<Object> set = map.get(value);
if (set != null)
{
return Collections.unmodifiableSet(set);
}
}
return null;
}
public static class Test
{
private String value1;
private String value2;
public int number;
public Test(String v1, String v2, int n)
{
value1 = v1;
value2 = v2;
number = n;
}
public String getValue1()
{
return value1;
}
public void setValue1(String value1)
{
this.value1 = value1;
}
public String getValue2()
{
return value2;
}
public void setValue2(String value2)
{
this.value2 = value2;
}
@Override
public String toString()
{
return "Test [value1=" + value1 + ", value2=" + value2 + ", number=" + number + "]";
}
}
public static void main(String[] args) throws Exception
{
Test test1 = new Test("blue", "dog", 5);
Test test2 = new Test("blue", "cat", 10);
Test test3 = new Test("green", "duck", 10);
Indexer indexer = new Indexer();
indexer.add(test1);
indexer.add(test2);
indexer.add(test3);
System.out.println("get value1 = blue: \n" + indexer.get("value1", "blue"));
System.out.println("\nget value1 = green: \n" + indexer.get("value1", "green"));
System.out.println("\nget number = 5: \n" + indexer.get("number", 5));
System.out.println("\nget number = 10: \n" + indexer.get("number", 10));
}
}
更好的運行時間......什麼?對不起,我不清楚你的意思。 –
_you_想什麼?這似乎是功課,所以這個問題應該顯示一些研究工作。 –
你是什麼意思,「A」==「a」? (一般來說,如果你知道所有你需要的變量,自定義類將會變得更好。) –