2010-06-15 27 views
6

Java'da Birden çok anahtarı aynı değere eşlemek için bir yol arıyorum. en aşağıdaki gibi ben, değerleri olarak "y" ve "z" numaralarını tuşları olarak 0-9 ve "x" var diyelim: Java veri yapısı aynı değere birden çok anahtarı eşleştirmek için

0->y 
1->y 
2->y 
3->x 
4->x 
5->y 
6->z 
7->y 
8->z 
9->z 

şimdi x, y ve z gerçekten uzun dizeleri

ve ben milyonlarca anahtarla, dizeleri birkaç kez depolayamam. Nasıl devam edersiniz? Ben

Bir fikir iki dizi yaratmaktı: anahtar yapay bir ikinci olan orijinal tuşları eşleştirilir ve bulundukları oluşturulduğu başka dizide gerçek değerler anahtarıdır. Bu şekilde değerlere değerler sadece bir kez saklanır ve özgün anahtarlar hala dolaylı eşlenebilir:

0->k1 
1->k1 
2->k1 
3->k2 
4->k2 
5->k1 
6->k3 
7->k1 
8->k3 
9->k3 

k1->y 
k2->x 
k3->z 

Soru olsa: Daha iyi bir veri yapısı bunun için var mı?

cevap

19

- kadar uzun olduğunu fark etmez bu yüzden sadece, dize değil, onun bir kopyası başvuru depoluyor. Aynı dize değeri birden çok kez bina varsa

, değeri her zaman için aynı String nesnesi almak için intern() kullanın.

+0

Bu mantıklı. Teşekkür ederim. Stajyer için – eikes

+3

+1() ' –

+0

Pete, yeterince adil. Üzerinde yazı yazmak için zamanım yok, bu yüzden yorumu sildim. –

1

Soruyu gerçekten anlamıyorum. Eğer bir dizi Dizginiz varsa: String[] arr, o zaman aynı nesneye farklı indeksler ayarlayın - referansları aynı yapın. Herhangi Map<Integer,String> yapacak

String[] map = new String[10]; 
String x = "foo"; 
String y = "bar"; 
String z = "baz"; 
map[0] = x; 
map[1] = y; 
map[2] = x; 
//... 
2

Anahtar/değer eşleştirmeyi neden ters çevirmiyorsunuz? değerler için ayarla veya diziyi kullan: bellekten tasarruf etmek için elle yapmak gerekmez

x->{3, 4} 
y->{0, 1, 2, 5, 7} 
z->{6, 8, 9} 
-1

Java otomatik olarak sizin için dize referansları pekiştirecektir. Anahtarları/değerleri bir HashMap'e yerleştirebilirsiniz. Eğer (IMO, en iyi yol olacaktır) Pete Kirkham önerisini beğenmezseniz

+1

Bu doğru değil. Eğer bir değişmezse, derleyici, String'leri içersinde eşit editörler aynı String nesnesiyle değiştirecek ve 'intern()' işlevini el ile çağırabilecektir, ancak Java hiçbir zaman çalışma zamanında bunu hiçbir zaman dolaylı/otomatik olarak yapmayacaktır.Bir String Java'ya başvurduktan sonra, bu referansı sahnelerin arkasına işaret edecek şekilde değiştirmezsiniz ve her zaman "new" anahtar sözcüğünü kullanarak aynı dizgenin benzersiz örneklerini görebilirsiniz. Bu nedenle, hiçbirisi giriş akımından veya kullanıcı girişinden okunan Dizeler için olmaz. –

1

, bir Google tahsil edilen (er ... Guava şimdi) MultiMap kullanabilirsiniz.

+4

Ben de MultiMap önermek için gidiyordu ama o aynı değerde tersi yerine eşleme çok anahtar arıyor. – Stevko

0

Her harita giriş tuşları 1 her birkaç yüz tamsayılar sırasına bazı sayıdan fazla yoğun ise teorik 2.

halinde tutulması gereken bir değeri temsil birkaç yüz bit kullanacak, öyle olacak bir harita kullanmamak için daha hızlı ve daha küçük, ancak bir dizi - Trove TByteArrayList gibi bir şey - burada bayt değerleri dizelerinize eşlenir. 4x daha fazla yoğunluk almak istiyorsanız, 4 değeri tek bir bayta paketleyin.

Bu sadece çok veri varken rahatsız mantıklı - ama sen tuşları milyonlarca söyledi, ben iyi bir uyum olduğunu düşünüyorum.

İlgili konular