जावा सहयोगी-सरणी


214

जावा में जैसे मैं कर सकता हूं, मैं कैसे जावा में साहचर्य सरणियों को बना सकता / सकती हूं?

उदाहरण के लिए:

$arr[0]['name'] = 'demo';
$arr[0]['fname'] = 'fdemo';
$arr[1]['name'] = 'test';
$arr[1]['fname'] = 'fname';

जवाबों:


356

जावा साहचर्य सरणियों का समर्थन नहीं करता है, हालाँकि इसे आसानी से प्राप्त किया जा सकता है Map। उदाहरण के लिए,

Map<String, String> map = new HashMap<String, String>();
map.put("name", "demo");
map.put("fname", "fdemo");
// etc

map.get("name"); // returns "demo"

आपके उदाहरण के लिए और भी सटीक (चूंकि आप स्ट्रिंग को किसी भी वस्तु से बदल सकते हैं जो आपकी आवश्यकताओं को पूरा करता है) घोषित करना होगा:

List<Map<String, String>> data = new ArrayList<>();
data.add(0, map);
data.get(0).get("name"); 

अधिक जानकारी के लिए आधिकारिक दस्तावेज देखें


2
यह फेंक देगा NullPointerExceptionयदि बाहरी मानचित्र में प्रवेश के लिए नक्शा नहीं है 0। क्या $ गिरफ्तार [0] ['नाम'] के साथ PHP अधिक अनुमेय नहीं है (मैं इस भाषा को बिल्कुल नहीं जानता)?
टॉमाज़ नर्कविक्ज़

9
यदि आप किसी ऐसी कुंजी को एक्सेस करने का प्रयास करते हैं, जो मौजूद नहीं है, तो PHP इसे पसंद नहीं करेगी, :)
Svish

2
@ हेड, कुछ कार्यान्वयन आवश्यक था। आज , हालांकि, (अनपेक्षित?) प्रदर्शन अंतर के कारण मैंArrayList लगभग सभी मामलों में पसंद करूंगा । लेकिन यह एक और चर्चा है।
जोहान Sjöberg

3
सटीक हैश आकार को इनिशियलाइज़ करना न भूलें और लोड फैक्टर को 1: HashMap <स्ट्रिंग, स्ट्रिंग> (क्षमता, 1) के रूप में सेट करें। अन्यथा आप एक विशाल ओवरहेड को लागू कर सकते हैं और आपकी वस्तुओं को बहुत अधिक रैम की आवश्यकता होती है। ArrayList के लिए +1, लेकिन उत्तर का कोई संपादन क्यों नहीं?
मार्कस

1
@ मारकस " सटीक हैश आकार को इनिशियलाइज़ करना और लोड फैक्टर को 1 के रूप में सेट करना कभी न भूलें " - आपको वह सलाह कहाँ से मिलती है? आपको लगभग कभी भी लोड-फैक्टर को निर्दिष्ट नहीं करना चाहिए HashMap, और निश्चित रूप से व्यवहार के बेंचमार्किंग के बिना और आपके उपयोग के मामले के लिए बेहतर लोड-फैक्टर खोजने के बिना नहीं होना चाहिए । प्रारंभिक आकार निर्दिष्ट करने का एकमात्र कारण यदि आप पहले से जानते हैं कि मानचित्र बहुत बड़ा होगा। HashMapखाली होने पर (बहुत) मेमोरी बर्बाद नहीं करता है, लेकिन यदि आप एक बड़ा नक्शा बनाने का इरादा रखते हैं, तो आप कई सरणी-आकार को सहेज कर यह निर्दिष्ट कर सकते हैं कि यह सामने का आकार है।
dimo414

47

Java में PHP की तरह साहचर्य सरणियाँ नहीं हैं।

आप जो कर रहे हैं उसके लिए विभिन्न समाधान हैं, जैसे कि एक मानचित्र का उपयोग करना, लेकिन यह इस बात पर निर्भर करता है कि आप जानकारी कैसे देखना चाहते हैं। आप आसानी से एक वर्ग लिख सकते हैं जो आपकी सभी जानकारी रखता है और उनमें से उदाहरणों को संग्रहीत करता है ArrayList

public class Foo{
    public String name, fname;

    public Foo(String name, String fname){
        this.name = name;
        this.fname = fname;
    }
}

और तब...

List<Foo> foos = new ArrayList<Foo>();
foos.add(new Foo("demo","fdemo"));
foos.add(new Foo("test","fname"));

तो आप उन्हें पसंद कर सकते हैं ...

foos.get(0).name;
=> "demo"

20

आप इसे मैप्स के माध्यम से पूरा कर सकते हैं। कुछ इस तरह

Map<String, String>[] arr = new HashMap<String, String>[2]();
arr[0].put("name", "demo");

लेकिन जैसा कि आप जावा का उपयोग करना शुरू करते हैं मुझे यकीन है कि आप पाएंगे कि यदि आप एक वर्ग / मॉडल बनाते हैं जो आपके डेटा का प्रतिनिधित्व करता है तो आपके सबसे अच्छे विकल्प होंगे। मुझे क्या करना होगा

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);

मुझे लगता है कि मुझे यह तरीका बेहतर लगता है। Php से आ रहा है जहां सब कुछ इतना सरल है, जावा का उपयोग करते हुए अजीब है, लेकिन महान समाधान है। धन्यवाद।
१२:५ous पर ठंढाईदार

ArrayList के बजाय List का उपयोग क्यों करें? एक जावा नौसिखिया यहाँ।
सोबियाहोलिक

सूची ’एक अमूर्त वर्ग है और 'एरियर लाईस्ट’ उस वर्ग के कार्यान्वयन में से एक है, एक ही अमूर्त वर्ग से प्राप्त अन्य प्रकार की सूचियाँ हैं। तो इस वजह से एक ArrayList भी एक List है। आप एक अमूर्त वर्ग का एक उदाहरण नहीं बना सकते हैं, बस इसे यहां टाइप के रूप में उपयोग करें, आपको अपने उदाहरणों के लिए कार्यान्वयन का उपयोग करने की आवश्यकता है। तो सूची प्रकार है, और ArrayList यहाँ उदाहरण है।
वीटा

12

जावा में साहचर्य सरणी जैसी कोई चीज नहीं है। इसका निकटतम रिश्तेदार एक है Map, जो दृढ़ता से टाइप किया गया है, हालांकि कम सुरुचिपूर्ण वाक्यविन्यास / एपीआई है।

यह निकटतम है जो आप अपने उदाहरण के आधार पर प्राप्त कर सकते हैं:

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

1
क्या है LazyMap.decorateऔर InstantiateFactoryऔर सामान के लिए?
शविश

+1 सभी अन्य उत्तर यह मानते हैं कि "कुंजियों" में से एक पूर्णांक है। क्या होगा यदि सहयोगी सरणी दो गैर-पूर्णांक कुंजियों (एक टपल हम अजगर में कहेंगे) पर आधारित थी? मुझे विश्वास है कि आपको इस दृष्टिकोण का उपयोग करने की आवश्यकता होगी क्योंकि अनुक्रमण असंभव है।
डेमॉन्गोलम

10

को देखो मानचित्र इंटरफ़ेस, और ठोस वर्ग में HashMap

एक नक्शा बनाने के लिए:

Map<String, String> assoc = new HashMap<String, String>();

एक कुंजी-मूल्य जोड़ी जोड़ने के लिए:

assoc.put("name", "demo");

एक कुंजी के साथ जुड़े मूल्य को पुनः प्राप्त करने के लिए:

assoc.get("name")

और निश्चित रूप से, आप मैप्स की एक सरणी बना सकते हैं, जैसा कि लगता है कि आप क्या चाहते हैं:

Map<String, String>[] assoc = ...

6

वैसे मैं भी साहचर्य सरणी की तलाश में था और सबसे अच्छे समाधान के रूप में मानचित्रों की सूची पाया।

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);

}


}


5

जावा में साहचर्य सरणियाँ नहीं हैं, निकटतम चीज़ जो आप प्राप्त कर सकते हैं वह है मैप इंटरफ़ेस

यहाँ उस पेज से एक नमूना है।

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);
    }
}

यदि साथ चलाया जाए:

java Freq if it is to be it is up to me to delegate

आपको मिलेगा:

8 distinct words:
{to=3, delegate=1, be=1, it=2, up=1, if=1, me=1, is=2}

3

जावा में सहयोगी सरणियाँ जैसे PHP:

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);
}

अधिक जानकारी के लिए, क्लास सॉफ्टहैश मैप देखें: https://shiro.apache.org/static/1.2.2/apidocs/org/apache/shiro/util/SoftHashMap.html


Map.containsKey () विधि सभी मैप की कुंजियों के माध्यम से पुनरावृत्ति करती है, और इसलिए Map.get () विधि जो स्वाभाविक रूप से कुंजी मिलने पर एक मान लौटाती है। तो बस Map.get () उन दोनों तकनीकों को करता है, केवल एक बार (और अधिक प्रदर्शन करने वाला), इस नए कोड को लिखे बिना। इसके अलावा Map.get () पहली कुंजी के साथ जुड़ा हुआ मान लौटाता है, और फिर खोज बंद कर देता है, जो इस पैटर्न के लिए तेज़ और परिचित व्यवहार है। इस पोस्ट में कोड खोज कुंजी के मिलान के बाद भी सभी कुंजी के माध्यम से पुनरावृत्ति करता रहता है, और अंतिम मिलान की गई कुंजी (पहले मिलान की गई कुंजी) नहीं देता है।
मैथ्यू

3

ArrayList <मानचित्र <स्ट्रिंग, स्ट्रिंग>> का उपयोग करें

यहाँ एक कोड नमूना:

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);

आउटपुट:

उत्पादों: [{आईडी = 0001, नाम = prod1}, {आईडी = 0002, नाम = prod2}]


1

JDK 1.5 (http://tinyurl.com/3m2lxju) में यहां तक ​​कि एक नोट है: "नोट:" यह वर्ग अप्रचलित है। नए कार्यान्वयन को इस वर्ग को विस्तारित करने के बजाय मानचित्र इंटरफ़ेस को लागू करना चाहिए। " सादर, एन।


1
Object[][] data = {
{"mykey1", "myval1"},
{"mykey2", "myval2"},
{new Date(), new Integer(1)},
};

हां, कुंजी द्वारा खोज मूल्य के लिए इसे पुनरावृत्ति की आवश्यकता होती है, लेकिन यदि आपको उन सभी की आवश्यकता है, तो यह सबसे अच्छा विकल्प होगा।


0

वास्तव में जावा साहचर्य सरणियों का समर्थन करता है जिसे वे शब्दकोष कहते हैं!


10
यदि आप download.oracle.com/javase/1.4.2/docs/api/java/util/… देखें, तो ध्यान दें कि यह वर्ग (ए) सार और (बी) पदावनत है।
फेलिक्स क्लिंग

0

इसके बारे में अधिक सोचकर, मैं इस समस्या से निपटने के लिए एक अधिक सामान्य उद्देश्य के रूप में ट्यूपल्स को बाहर निकालना चाहूंगा। जबकि ट्यूपल्स जावा के मूल निवासी नहीं हैं, मैं जावुतुपल्स का उपयोग मुझे वही कार्यक्षमता प्रदान करने के लिए करता हूं जो अन्य भाषाओं में मौजूद होगी। पूछे गए प्रश्न से कैसे निपटना है, इसका एक उदाहरण है

Map<Pair<Integer, String>, String> arr = new HashMap<Pair<Integer, String>, String>();
Pair p1 = new Pair(0, "name");
arr.put(p1, "demo");

मुझे यह दृष्टिकोण पसंद है क्योंकि इसे ट्राइ और अन्य उच्चतर ऑर्डर किए गए समूहों को एपीआई प्रदान की गई कक्षाओं और विधियों के साथ बढ़ाया जा सकता है।


-2

PHP टिप्पणी के बारे में 'नहीं, PHP इसे पसंद नहीं करेगा'। दरअसल, जब तक आप कुछ बहुत ही प्रतिबंधात्मक (PHP के लिए) अपवाद / त्रुटि स्तरों (और शायद तब भी नहीं) निर्धारित करते हैं, तब तक PHP ठगता रहेगा।

डिफ़ॉल्ट रूप से क्या होगा कि एक गैर मौजूदा वैरिएबल / आउट ऑफ बाउंड्स एरेस एलीमेंट में आपकी वैल्यू 'अनसेट' हो जाती है जिसे आप असाइन कर रहे हैं। नहीं, यह शून्य नहीं है। PHP में एक पर्ल / सी वंश है, जो मैं समझता हूं। तो वहाँ हैं: परेशान और गैर मौजूदा चर, मान जो निर्धारित किए गए हैं लेकिन NULL, बूलियन गलत मान हैं, तो बाकी सब कुछ जो मानक लैंग्वेज हैं। आपको उन लोगों के लिए अलग से परीक्षण करना होगा, या फ़ंक्शन / सिंटैक्स में निर्मित राइट मूल्यांकन का चयन करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.