Yanıtlar:
Java ilişkilendirilebilir dizileri desteklemez, ancak bu a kullanılarak kolayca gerçekleştirilebilir Map
. Örneğin,
Map<String, String> map = new HashMap<String, String>();
map.put("name", "demo");
map.put("fname", "fdemo");
// etc
map.get("name"); // returns "demo"
Örneğinize göre daha da doğru (String'i ihtiyaçlarınızı karşılayan herhangi bir nesneyle değiştirebileceğiniz için) beyan etmek olacaktır:
List<Map<String, String>> data = new ArrayList<>();
data.add(0, map);
data.get(0).get("name");
ArrayList
nedeniyle (beklenmeyen?) Performans farklılıkları neredeyse bütün davaları içinde. Ama bu başka bir tartışma.
HashMap
ve kesinlikle davranışı kasıtlı olarak karşılaştırmadan ve kullanım durumunuz için daha iyi bir yük faktörü bulmadan kesinlikle belirtmemelisiniz. Başlangıç boyutunu belirtmenin tek nedeni, haritanın çok büyük olacağını önceden bilmenizdir. HashMap
boşsa (fazla) belleği boşa harcamaz, ancak büyük bir harita oluşturmak istiyorsanız, önündeki boyutu belirterek birkaç dizi yeniden boyut kaydedebilirsiniz.
Java'nın PHP gibi ilişkilendirilebilir dizileri yoktur.
Yaptığınız şey için bir Harita kullanmak gibi çeşitli çözümler vardır, ancak bu bilgileri nasıl aramak istediğinize bağlıdır. Tüm bilgilerinizi tutan bir sınıfı kolayca yazabilir ve bunların örneklerini bir ArrayList
.
public class Foo{
public String name, fname;
public Foo(String name, String fname){
this.name = name;
this.fname = fname;
}
}
Ve sonra...
List<Foo> foos = new ArrayList<Foo>();
foos.add(new Foo("demo","fdemo"));
foos.add(new Foo("test","fname"));
Böylece onlara şu şekilde erişebilirsiniz ...
foos.get(0).name;
=> "demo"
Bunu Haritalar üzerinden yapabilirsiniz. Gibi bir şey
Map<String, String>[] arr = new HashMap<String, String>[2]();
arr[0].put("name", "demo");
Ancak Java'yı kullanmaya başladığınızda, verilerinizi temsil eden bir sınıf / model oluşturursanız en iyi seçeneklerin olacağını göreceksiniz. yapardım
class Person{
String name;
String fname;
}
List<Person> people = new ArrayList<Person>();
Person p = new Person();
p.name = "demo";
p.fname = "fdemo";
people.add(p);
Java'da ilişkilendirilebilir dizi diye bir şey yoktur. En yakın akrabası, Map
güçlü bir şekilde yazılan a'dır, ancak daha az zarif sözdizimi / API'ye sahiptir.
Örneğinize göre alabileceğiniz en yakın şey budur:
Map<Integer, Map<String, String>> arr =
org.apache.commons.collections.map.LazyMap.decorate(
new HashMap(), new InstantiateFactory(HashMap.class));
//$arr[0]['name'] = 'demo';
arr.get(0).put("name", "demo");
System.out.println(arr.get(0).get("name"));
System.out.println(arr.get(1).get("name")); //yields null
LazyMap.decorate
ve InstantiateFactory
falan mı?
Bak Harita arayüzü ve beton sınıfı en HashMap .
Harita oluşturmak için:
Map<String, String> assoc = new HashMap<String, String>();
Bir anahtar / değer çifti eklemek için:
assoc.put("name", "demo");
Bir anahtarla ilişkili değeri almak için:
assoc.get("name")
Elbette, istediğiniz gibi göründüğü için bir Haritalar dizisi oluşturabilirsiniz:
Map<String, String>[] assoc = ...
Peki ben de İlişkisel dizi arayışı içinde ve en iyi çözüm olarak harita listesi bulundu.
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class testHashes {
public static void main(String args[]){
Map<String,String> myMap1 = new HashMap<String, String>();
List<Map<String , String>> myMap = new ArrayList<Map<String,String>>();
myMap1.put("URL", "Val0");
myMap1.put("CRC", "Vla1");
myMap1.put("SIZE", "Vla2");
myMap1.put("PROGRESS", "Vla2");
myMap.add(0,myMap1);
myMap.add(1,myMap1);
for (Map<String, String> map : myMap) {
System.out.println(map.get("URL"));
}
//System.out.println(myMap);
}
}
Perl karma işleminin Java eşdeğeri
HashMap<Integer, HashMap<String, String>> hash;
Java'nın ilişkilendirilebilir dizileri yoktur, alabileceğiniz en yakın şey Harita arayüzüdür
İşte o sayfadan bir örnek.
import java.util.*;
public class Freq {
public static void main(String[] args) {
Map<String, Integer> m = new HashMap<String, Integer>();
// Initialize frequency table from command line
for (String a : args) {
Integer freq = m.get(a);
m.put(a, (freq == null) ? 1 : freq + 1);
}
System.out.println(m.size() + " distinct words:");
System.out.println(m);
}
}
Şununla çalıştırılırsa:
java Freq if it is to be it is up to me to delegate
Alacaksınız:
8 distinct words:
{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}
PHP'deki gibi PHP'deki ilişkisel diziler:
SlotMap hmap = new SlotHashMap();
String key = "k01";
String value = "123456";
// Add key value
hmap.put( key, value );
// check if key exists key value
if ( hmap.containsKey(key)) {
//.....
}
// loop over hmap
Set mapkeys = hmap.keySet();
for ( Iterator iterator = mapkeys.iterator(); iterator.hasNext();) {
String key = (String) iterator.next();
String value = hmap.get(key);
}
Daha fazla bilgi için, bkz. Sınıf SoftHashMap: https://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/util/SoftHashMap.html
ArrayList <Map <String, String>> kullanın
İşte bir kod örneği:
ArrayList<Map<String, String>> products = new ArrayList<Map<String, String>>();
while (iterator.hasNext()) {
Map<String, String> product = new HashMap<String, String>();
Element currentProduct = iterator.next();
product.put("id",currentProduct.get("id"));
product.put("name" , currentProduct.get("name") );
products.add(product );
}
System.out.println("products : " + products);
Çıktı :
ürünler: [{id = 0001, ad = ürün1}, {id = 0002, ad = ürün2}]
Aslında Java, sözlük olarak adlandırılan ilişkilendirilebilir dizileri destekliyor!
Bunun hakkında daha fazla düşünerek, bu sorunu ele almanın daha genel amaçlı bir yolu olarak tuples atmak istiyorum. Tuples Java'ya özgü olmasa da, Javatuples'ı bana diğer dillerde var olacak aynı işlevselliği sağlamak için kullanıyorum . Sorulan soru ile nasıl başa çıkılacağına bir örnek şudur:
Map<Pair<Integer, String>, String> arr = new HashMap<Pair<Integer, String>, String>();
Pair p1 = new Pair(0, "name");
arr.put(p1, "demo");
Bu yaklaşımı seviyorum çünkü api sağlanan sınıflar ve yöntemler ile üçlü ve diğer yüksek sıralı gruplara genişletilebilir.
PHP'nin 'Hayır, PHP hoşuna gitmedi' yorumu ile ilgili. Aslında, bazı çok kısıtlayıcı (PHP için) istisna / hata seviyeleri (ve belki de o zaman bile) ayarlamazsanız PHP çekmeye devam eder.
Varsayılan olarak OLACAK olan şey, varolmayan bir değişkene / sınırların dışında dizi öğesine erişimin, atadığınız değerinizi "kaldırması" dır. HAYIR, bu boş değil. PHP anladığım kadarıyla Perl / C soyuna sahiptir. Yani: ayarlanmamış ve mevcut olmayan değişkenler, ayarlanan değerler NULL, Boolean False değerleri, daha sonra standart dillerin sahip olduğu diğer her şey. Bunları ayrı ayrı test etmeniz veya VEYA işlev / sözdiziminde yerleşik SAĞ değerlendirmeyi seçmeniz gerekir.
NullPointerException
dış haritası girişi için harita içermiyorsa0
. PHP $ arr [0] ['name'] ile daha izinli değil mi (bu dili hiç bilmiyorum)?