জাভা এসোসিয়েটিভ-অ্যারে


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] ['নাম'] (আমি এই ভাষাটি মোটেই জানি না) এর সাথে আরও অনুমোদনযোগ্য নয়?
টমাসজ নুরকিউইচজ

9
আপনি যদি নেই এমন কোনও কীটি অ্যাক্সেস করার চেষ্টা করেন তবে পিএইচপি এটি পছন্দ করবে না, না :)
সুইভিশ

2
@ এডেম, কিছু বাস্তবায়ন করা দরকার ছিল। আজ যাইহোক, আমিArrayList প্রায় সমস্ত ক্ষেত্রে (অপ্রত্যাশিত?) পারফরম্যান্স পার্থক্যের কারণে পছন্দ করব । তবে সেটা অন্য আলোচনা।
জোহান সিজবার্গ

3
সঠিক হ্যাশের আকারটি আরম্ভ করতে এবং লোড ফ্যাক্টরটিকে 1: হ্যাশম্যাপ <স্ট্রিং, স্ট্রিং> (ক্ষমতা, 1) হিসাবে সেট করতে কখনও ভুলবেন না। অন্যথায় আপনি একটি বিশাল ওভারহেড বাস্তবায়ন করতে পারেন এবং আপনার অবজেক্টগুলিকে প্রচুর র‍্যামের দরকার পড়ে। অ্যারেলিস্টের জন্য +1, তবে উত্তরটির কোনও সম্পাদনা কেন করবেন না?
মার্কাস

1
@ মার্কাস " সঠিক হ্যাশের আকার আরম্ভ করতে এবং লোড ফ্যাক্টরটিকে 1 হিসাবে সেট করতে কখনও ভুলবেন না - আপনি এই পরামর্শটি কোথায় পাবেন? আপনি কখনই কোনও এর লোড-ফ্যাক্টর নির্দিষ্ট করা উচিত HashMapনয় এবং অবশ্যই উদ্দেশ্যমূলকভাবে আচরণটি বেঞ্চমার্কিং না করে এবং আপনার ব্যবহারের ক্ষেত্রে আরও ভাল লোড-ফ্যাক্টর না খুঁজে পাওয়া উচিত। প্রাথমিক আকার নির্দিষ্ট করার একমাত্র কারণ হ'ল যদি আপনি আগেই জানতেন যে মানচিত্রটি খুব বড় হবে। HashMapখালি থাকলে (বেশি) মেমোরি নষ্ট করে না তবে আপনি যদি একটি বৃহত মানচিত্র তৈরি করতে চান তবে আপনি এর আকারের সামনের অংশটি উল্লেখ করে বিভিন্ন অ্যারে-আকারগুলি সংরক্ষণ করতে পারবেন।
ডিমো 414

47

জাভাতে পিএইচপি-র মতো সাহসী অ্যারে নেই।

আপনি যা করছেন তার জন্য বিভিন্ন সমাধান রয়েছে যেমন মানচিত্র ব্যবহার করা, তবে আপনি কীভাবে তথ্য সন্ধান করতে চান তার উপর নির্ভর করে। আপনি সহজেই কোনও শ্রেণি লিখতে পারেন যা আপনার সমস্ত তথ্য এবং এগুলির একটি উদাহরণ সংরক্ষণ করে 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);

আমি মনে করি আমি এই পদ্ধতিটি আরও ভাল পছন্দ করি ধন্যবাদ। পিএইচপি থেকে আসা যেখানে সমস্ত কিছু সহজ তাই জাভা ব্যবহার করে সাজানো ধরণের, তবে দুর্দান্ত সমাধান। ধন্যবাদ।
হিমশীতল

অ্যারেলিস্টের পরিবর্তে তালিকা কেন ব্যবহার করবেন? একটি জাভা নবাগত এখানে।
সোবিয়োলিক

'তালিকা' একটি বিমূর্ত শ্রেণি এবং 'অ্যারেলিস্ট' সেই শ্রেণীর বাস্তবায়নগুলির মধ্যে একটি, একই বিমূর্ত শ্রেণি থেকে প্রাপ্ত অন্যান্য ধরণের তালিকা রয়েছে। সুতরাং এই কারণে একটি অ্যারেলিস্ট এছাড়াও একটি তালিকা। আপনি কোনও বিমূর্ত শ্রেণীর উদাহরণ তৈরি করতে পারবেন না, কেবল এটি এখানে টাইপ হিসাবে ব্যবহার করুন, আপনার উদাহরণগুলির জন্য আপনার প্রয়োগটি ব্যবহার করা দরকার। সুতরাং তালিকাটি টাইপ, এবং অ্যারেলিস্ট এখানে উদাহরণস্বরূপ।
ভেটা

12

জাভাতে অ্যা্যাসোসিয়েটিভ অ্যারের মতো জিনিস নেই। এর নিকটতম আত্মীয় হ'ল একটি Map, যা দৃ strongly়ভাবে টাইপ করা আছে তবে কম মার্জিত সিনট্যাক্স / এপিআই রয়েছে।

এটি আপনার উদাহরণের ভিত্তিতে সবচেয়ে কাছের আপনি পেতে পারেন:

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 অন্যান্য সমস্ত উত্তর মনে হয় যে "কী" এর মধ্যে একটি পূর্ণসংখ্যা। যদি সহযোগী অ্যারে দুটি অ-পূর্ণসংখ্য কীগুলির উপর ভিত্তি করে তৈরি হত (একটি টিপল যা আমরা পাইথনে বলব)? আমি বিশ্বাস করি যে সূচীকরণ অসম্ভব হয়ে উঠায় আপনার এই পদ্ধতির ব্যবহার করা দরকার to
ডেমোঙ্গোলেম

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

জাভাতে সহযোগী অ্যারেগুলি পিএইচপি-র মতো:

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 () পদ্ধতিটি মানচিত্রের সমস্ত কীগুলির মাধ্যমে পুনরাবৃত্তি করে এবং ম্যাপ.জেট () পদ্ধতিটি কীটি সন্ধানের পরে স্বাভাবিকভাবেই একটি মানও দেয়। সুতরাং এই নতুন কোডটি না লিখে কেবল ম্যাপ.জেট () এই দুটি কৌশলই কেবল একবার (এত বেশি পারফরম্যান্ট) সম্পাদন করে। এছাড়াও ম্যাপ.জেট () প্রথম কীটির সাথে সম্পর্কিত মানটি ফিরিয়ে দেয় এবং তারপরে অনুসন্ধান বন্ধ করে দেয় যা দ্রুত এবং এই প্যাটার্নটির জন্য পরিচিত আচরণ। অনুসন্ধানের কী মেলে যাওয়ার পরেও এই পোস্টের কোডটি সমস্ত কীগুলির মাধ্যমে পুনরাবৃত্তি করে এবং শেষ মিলিত কীটি (প্রথম মিলিত কী নয়) প্রদান করে।
ম্যাথু

3

অ্যারেলিস্ট <মানচিত্র <স্ট্রিং, স্ট্রিং>> ব্যবহার করুন

এখানে একটি কোড নমুনা:

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, নাম = প্রোড 1}, {আইডি = 0002, নাম = প্রোড 2}]


1

জেডিকে ১.৫ (http://tinyurl.com/3m2lxju) এ এমনকি একটি নোট রয়েছে: "দ্রষ্টব্য: এই শ্রেণিটি অপ্রচলিত New শুভেচ্ছা, এন।


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

হ্যাঁ, কী দ্বারা মান সন্ধানের জন্য এটির পুনরাবৃত্তি প্রয়োজন, তবে আপনার যদি সমস্তগুলির প্রয়োজন হয় তবে এটি সেরা পছন্দ হবে।


0

প্রকৃতপক্ষে জাভা সহযোগী অ্যারেগুলিকে সমর্থন করে তাদের অভিধান বলা হয়!


10
আপনি যদি ডাউনলোড. 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

পিএইচপি মন্তব্য সম্পর্কে 'না, পিএইচপি এটি পছন্দ করবে না'। প্রকৃতপক্ষে, পিএইচপি চ্যাগিং চালিয়ে যেতে পারে যদি না আপনি কিছু খুব সীমাবদ্ধ (পিএইচপি-র জন্য) ব্যতিক্রম / ত্রুটির স্তর নির্ধারণ করেন (এবং সম্ভবত তখনও না)।

ডিফল্টরূপে যা ঘটবে তা হ'ল অস্তিত্বের চলক / সীমার বাইরে সীমা অ্যালিমেন্টের অ্যাক্সেস আপনার মূল্যকে 'আনসেট' করে দেয় যা আপনি নির্ধারণ করছেন। না, এটি বাতিল নয়। পিএইচপি-র একটি পার্ল / সি বংশ রয়েছে যা আমি বুঝতে পারি। সুতরাং এখানে রয়েছে: আনসেট এবং অ বিদ্যমান বিদ্যমান ভেরিয়েবলগুলি, মানগুলি সেট করা আছে তবে এটি নুল, বুলিয়ান মিথ্যা মান, তারপরে স্ট্যান্ডার্ড ল্যাঙ্গুয়েজের সমস্ত কিছু। তাদের আলাদাভাবে পরীক্ষা করতে হবে, অথবা ফাংশন / সিনট্যাক্সে নির্মিত নিখুঁত মূল্যায়ন চয়ন করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.