你好Java的人,從Java HashMap中提取ith值的有效方法?
我正在學習Java HashMaps。雖然我喜歡將它們放在一起是多麼容易,但我正在研究如何以有效的方式從地圖中提取第i個條目。爲了解釋...
比方說,這是我的代碼:
package HashPackage;
import java.util.HashMap;
public class newHashObject {
// Nested class
public class newObject {
int Data1;
int Data2;
public newObject(int a, int b){
this.Data1 = a;
this.Data2 = b;
}
}
// HashMap to contain newObjects
HashMap<Integer, newObject> cache = new HashMap<Integer, newObject>();
// Constructor
public newHashObject(){
// populate cache with 1000 newObjects:
for(int i=0; i<1000; i++)
cache.put(i, new newObject(i, i*2+101));
System.out.println("New cache created, total objects in cache: "+cache.size());
}
}
好了,沒有什麼激進至今。在現實生活中,我的HashMap中的條目不會以等於0,1,2,3 ......等等的密鑰進行歸檔,而是會用基本上隨機的數字鍵來歸檔。即如果你要檢查我的「現實生活」HashMap,你會看到鍵盤19,79,235,577,1023,1092等等。
現在我們假設我需要從哈希映射中提取出第i個元素。我不會提前知道關鍵的價值。例如,使用上面的「真實生活」地圖:如果我們開始將地圖的條目編號爲0,並且我想要取出第i = 4個條目,那麼我應該用鍵1023獲得條目。
我想過這一點,我想我可以通過從0我的HashMap只是重複,以我:
import java.util.Iterator;
...
// Is there a better way to do this?
public newObject iterateByIndex(int index){
Iterator<Integer> keySetIterator = cache.keySet().iterator();
int count=0;
if(index<cache.size()){
while(keySetIterator.hasNext()){
Integer key = keySetIterator.next();
if(count==index){
// We've found the ith entry in the cache
return cache.get(key);
}
count++;
}
}
return null;
}
此代碼的工作,但似乎笨重,如果絕對低效。我將需要調用這種方法數百萬次(不說謊!),並且從0到i的迭代每次都會是一個很大的時間消耗。
那麼......有什麼建議嗎? HashMap在這裏是錯誤的數據結構嗎? (我使用的是一個HashMap,因爲我的數據集非常大。)我很好奇在這種情況下更多經驗豐富的程序員可能會做什麼。
謝謝你的任何建議, -P
如果您需要在「ith」元素的HashMap中引用某些內容,那麼您使用的數據結構錯誤。 – rmlan
'HashMap'沒有定義的順序,所以「i-th」不是一個定義的概念。 「這個類不能保證地圖的順序,特別是它不能保證順序會隨着時間的推移保持不變。」 –
具體來說,Map接口並未傳達任何排序。有一些有序的Map實現,比如TreeMap和LinkedHashMap。你可以看看那些。 (但應該指出,這些只是授予一個「可預測的迭代次序」 - 你不能只是要求第425次入門而不重複第一次424.不理想!) – dcsohl