I'd seperti untuk membuat item baru yang sama dengan Util.Peta.Entri
yang akan berisi struktur kunci
, nilai
.
Masalahnya adalah bahwa saya dapat't instantiate sebuah Peta.Entri
karena itu's sebuah antarmuka.
Tidak ada yang tahu bagaimana untuk membuat yang baru generic kunci/nilai objek Peta.Entri?
Ada's publik statis kelas AbstractMap.SimpleEntry<K,V>
. Don't membiarkan Abstrak
bagian dari nama komputer anda: hal ini sebenarnya NOT yang abstrak
kelas (tapi yang top-level AbstractMap
adalah).
Fakta bahwa itu's statis
bersarang kelas berarti bahwa anda DON'T perlu melampirkan AbstractMap
contoh untuk menurunkannya, sehingga hal seperti ini mengkompilasi dengan baik:
Map.Entry<String,Integer> entry =
new AbstractMap.SimpleEntry<String, Integer>("exmpleString", 42);
Seperti dicatat di tempat lain menjawab, Jambu biji juga memiliki perangkat statis
pabrik metode Maps.immutableEntry
yang dapat anda gunakan.
Anda mengatakan:
aku't menggunakan
Peta.Entri
itu sendiri karena rupanya itu's baca-satunya objek yang dapat saya't instantiate baruinstanceof
Yang's tidak sepenuhnya akurat. Alasan mengapa anda dapat't menurunkannya secara langsung (yaitu dengan baru
) adalah karena itu's antarmuka Peta.Entri
.
Seperti dicatat dalam dokumentasi, AbstractMap.SimpleEntry
adalah @sejak 1.6
, jadi jika anda're terjebak ke 5.0, maka's tidak tersedia untuk anda.
Untuk mencari lain yang dikenal kelas yang mengimplementasikan Peta.Entri
, anda bahkan dapat pergi langsung ke javadoc. Dari Java versi 6
Antarmuka Peta.Entri<K,V>
Semua Salah Menerapkan Kelas:
Sayangnya versi 1.5 tidak daftar setiap dikenal melaksanakan kelas yang dapat anda gunakan, sehingga anda mungkin akan terjebak dengan menerapkan anda sendiri.
Anda hanya dapat menerapkan Peta.Entri<K, V>
antarmuka diri sendiri:
import java.util.Map;
final class MyEntry<K, V> implements Map.Entry<K, V> {
private final K key;
private V value;
public MyEntry(K key, V value) {
this.key = key;
this.value = value;
}
@Override
public K getKey() {
return key;
}
@Override
public V getValue() {
return value;
}
@Override
public V setValue(V value) {
V old = this.value;
this.value = value;
return old;
}
}
Dan kemudian menggunakannya:
Map.Entry<String, Object> entry = new MyEntry<String, Object>("Hello", 123);
System.out.println(entry.getKey());
System.out.println(entry.getValue());
Mencoba Maps.immutableEntry dari Jambu
Ini memiliki keuntungan menjadi kompatibel dengan Java 5 (tidak seperti AbstractMap.SimpleEntry
yang membutuhkan Java 6.)
Contoh AbstractMap.SimpleEntry:
import java.util.Map;
import java.util.AbstractMap;
import java.util.AbstractMap.SimpleEntry;
Instantiate:
ArrayList<Map.Entry<Integer, Integer>> arr =
new ArrayList<Map.Entry<Integer, Integer>>();
Tambahkan baris:
arr.add(new AbstractMap.SimpleEntry(2, 3));
arr.add(new AbstractMap.SimpleEntry(20, 30));
arr.add(new AbstractMap.SimpleEntry(2, 4));
Mengambil baris:
System.out.println(arr.get(0).getKey());
System.out.println(arr.get(0).getValue());
System.out.println(arr.get(1).getKey());
System.out.println(arr.get(1).getValue());
System.out.println(arr.get(2).getKey());
System.out.println(arr.get(2).getValue());
Harus cetak:
2
3
20
30
2
4
It's baik untuk menentukan tepi dari struktur grafik. Seperti yang antara neuron di kepala anda.
Mulai dari Jawa 9, ada yang baru utilitas metode yang memungkinkan untuk membuat aplikasi yang abadi entri yang Peta#entri(Objek, Objek)
.
Berikut ini adalah contoh sederhana:
Entry<String, String> entry = Map.entry("foo", "bar");
Karena itu adalah abadi, memanggil setValue
akan membuang UnsupportedOperationException
. Dengan keterbatasan lainnya adalah fakta bahwa itu tidak serializable dan null
sebagai kunci atau nilai adalah dilarang, jika hal ini tidak dapat diterima untuk anda, anda akan perlu menggunakan AbstractMap.SimpleImmutableEntry
atau AbstractMap.SimpleEntry
sebaliknya.
NB: Jika kebutuhan anda adalah untuk membuat langsung sebuah Peta
dengan 0 sampai dengan 10 (key, value) pasangan, anda dapat menggunakan metode jenis Peta.dari(K key1, V value1, ...)
.
Mengapa Peta.Entri
? Saya kira sesuatu seperti pasangan key-value lebih sesuai untuk kasus ini.
Gunakan jawa.util.AbstractMap.SimpleImmutableEntry
atau jawa.util.AbstractMap.SimpleEntry
org.apache.commons.lang3.tuple.Pasangan
menerapkan jawa.util.Peta.Entri
dan juga dapat digunakan standalone.
Juga seperti yang lain disebutkan Jambu biji's com.google.umum.mengumpulkan.Maps.immutableEntry(K, V)
melakukan trik.
Saya lebih memilih Pasangan
yang fasih Pasangan.dari(L, R)
sintaks.
Saya didefinisikan generik Pasangan kelas yang saya gunakan sepanjang waktu. It's besar. Sebagai bonus, dengan mendefinisikan statis metode pabrik (Pasangan.membuat) aku hanya harus menulis jenis argumen setengah seperti yang sering.
public class Pair<A, B> {
private A component1;
private B component2;
public Pair() {
super();
}
public Pair(A component1, B component2) {
this.component1 = component1;
this.component2 = component2;
}
public A fst() {
return component1;
}
public void setComponent1(A component1) {
this.component1 = component1;
}
public B snd() {
return component2;
}
public void setComponent2(B component2) {
this.component2 = component2;
}
@Override
public String toString() {
return "<" + component1 + "," + component2 + ">";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((component1 == null) ? 0 : component1.hashCode());
result = prime * result
+ ((component2 == null) ? 0 : component2.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final Pair<?, ?> other = (Pair<?, ?>) obj;
if (component1 == null) {
if (other.component1 != null)
return false;
} else if (!component1.equals(other.component1))
return false;
if (component2 == null) {
if (other.component2 != null)
return false;
} else if (!component2.equals(other.component2))
return false;
return true;
}
public static <A, B> Pair<A, B> create(A component1, B component2) {
return new Pair<A, B>(component1, component2);
}
}