কী হিসাবে হাশম্যাপ এবং ইনট


104

আমি একটি হ্যাশম্যাপ তৈরির চেষ্টা করছি যা মান হিসাবে কী এবং অবজেক্ট হিসাবে পূর্ণসংখ্যা থাকবে।

আমার বাক্য গঠনটি হ'ল:

HashMap<int, myObject> myMap = new HashMap<int, myObject>();

তবে, ফিরে আসা ত্রুটিটি হ'ল - টোকেন "ইনট" এ সিন্ট্যাক্স ত্রুটি, এই টোকেনের পরে মাত্রা প্রত্যাশিত - কেন আমি একটি মাত্রা যুক্ত করব তা বুঝতে পারছি না (অর্থাত্: অ্যারেতে প্রান্ত তৈরি করা) যেহেতু আমাকে কেবল একটি অঙ্ক সংরক্ষণ করতে হবে চাবি হিসাবে

আমি কি করতে পারে?

আগাম ধন্যবাদ! :)


14
HashMapআদিমগুলি, কেবলমাত্র বস্তুগুলি পরিচালনা করে না।
মেন্নো

সম্পর্কিত এসও প্রশ্ন , তবে intমান হিসাবে, কী নয়
সাইরোক্সিক্স

5
Integerপরিবর্তে ব্যবহার করুন।
হট লিক্স

পূর্ণসংখ্যার সাথে অটোবক্স ইন্টিং করা কি কেবল স্ট্রিং হিসাবে ডেটা সংরক্ষণ করা, যা আরও আরামদায়ক?
মার্সিন এরবেল

উত্তর:


25

আপনি কোনও আদিম ব্যবহার করতে পারবেন না কারণ হ্যাশম্যাপ কীটির জন্য অভ্যন্তরীণভাবে অবজেক্ট ব্যবহার করে। সুতরাং আপনি কেবলমাত্র একটি বস্তু ব্যবহার করতে পারেন যা অবজেক্ট থেকে উত্তরাধিকার সূত্রে আসে (এটি কোনও বস্তু)।

এটি হ্যাশম্যাপে ফাংশন () রাখুন এবং আপনি দেখতে পাচ্ছেন এটি কে অবজেক্টের জন্য ব্যবহার করে:

public V put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key);
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}

"K = e.key" অভিব্যক্তিটি এটি পরিষ্কার করা উচিত।

আমি পূর্ণসংখ্যার এবং অটোবক্সিংয়ের মতো একটি মোড়ক ব্যবহার করার পরামর্শ দিই।


137

Integerপরিবর্তে ব্যবহার করুন।

HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();

জাভা স্বয়ংক্রিয়ভাবে বস্তুর কাছে আপনার intআদিম মানকে অটোবক্স করবে Integer

ওরাকল জাভা ডকুমেন্টেশনগুলি থেকে অটোবক্সিং সম্পর্কে আরও পড়ুন ।


10
তারও কোনও শ্রেণির নাম রাখা উচিত নয়myObject
অ্যাডাম জেন্ট

@ অ্যাডামেন্ট সঠিক সমস্ত শ্রেণীর নাম রাজধানী দিয়ে শুরু করা উচিত, আমি প্রস্তাবিত কোড সংশোধন করেছি।
গ্যাবর্স

3
আমি জানি আপনি জানেন :) আমি কেবল ওপি জানে / শিখেছে তা নিশ্চিত করতে চাই। আমি জানি যে তিনি টাইপ প্যারামিটারে একটি পরিবর্তনশীল নাম রাখতে পারতেন।
অ্যাডাম জেন্ট

1
শুধু একটি দ্রুত সামান্য নোট, এটি ব্যবহার করার জন্য উত্তম ArrayMapবা SimpleArrayMapAndroid এর উপর মেমরি এবং বৃদ্ধি কর্মক্ষমতা (সেভ করতে আরও তথ্য )
নূহ Huppert

42

অ্যান্ড্রয়েড ডিভাইস এবং শেষ পর্যন্ত এখানে সবাই কে কোডগুলি জাভা জন্য: ব্যবহার SparseArrayভাল কার্য সম্পাদনার জন্য;

private final SparseArray<myObject> myMap = new SparseArray<myObject>();

এটির সাহায্যে আপনি পূর্ণসংখ্যার পরিবর্তে int ব্যবহার করতে পারেন;

int newPos = 3;

myMap.put(newPos, newObject);
myMap.get(newPos);

7
মনে রাখবেন স্পার্সআরে হ্যাশম্যাপের চেয়ে ধীর, তবে আরও মেমরি দক্ষ। সুতরাং, এটি বড় ডেটা সেটগুলিতে ব্যবহার করবেন না।
TpoM6oH

ধীরে ধীরে যখন স্পারসারাই আরও ভাল পারফরম্যান্সের জন্য ব্যবহৃত হয়? আমার অ্যান্ড্রয়েড গেমটিতে কোনটি ব্যবহার করবেন
সাপ

@ স্নেক SparseArrayআপনি যদি কিছুটা মেমরি বক্সিং এবং আনবক্সিং ইনটগুলি একটি হিসাবে বরাদ্দ করেন তবে ভিএম HashMapখুব শীঘ্রই আবর্জনা সংগ্রহের জন্য মৃত্যুদণ্ড স্থগিত করতে হবে। আপনি যদি বারবার এবং দ্রুত কিছু করার চেষ্টা করেন তবে এটি গুরুত্বপূর্ণ।
জন

1
সন্নিবেশ যে জটিলতা মনে রাখবেন মধ্যে SparseArrayহয় হে (ঢ) ( HashMapহয়েছে হে (1) )। উপাদানগুলির সংখ্যা বড় হলে এটি গুরুত্বপূর্ণ। যেমন অ্যারের শুরুতে সন্নিবেশ অনেক ধীর is
ভ্লাদিমির পেট্রাকোভিচ

1
@ এমকাজেমআখগারি ঠিক না শুরুতে সন্নিবেশের জন্য put()নেয় O(n)(না n log n) কারণ এটি অবস্থানটি সন্ধান করে এবং তারপরে নিম্নলিখিত সমস্ত উপাদানকে স্থানান্তরিত করে। delete()নিজেই প্রকৃতপক্ষে গ্রহণ করে তবে O(log n)পরবর্তী সন্নিবেশ বা মুছার পরে উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করতে আবর্জনা সংগ্রহ করতে হবে O(n)
ভ্লাদিমির পেট্রাকোভিচ


4

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

সুতরাং যখন পূর্ণসংখ্যার সাথে স্বয়ংক্রিয়ভাবে বাক্স স্থাপন করা হয়, তখন হাশম্যাপ সমান () সমেত কল করতে পারে পূর্ণসংখ্যার অবজেক্টে পদ্ধতি ।

এজন্য আপনার ইন্টির পরিবর্তে পূর্ণসংখ্যা ব্যবহার করা উচিত। মানে হ্যাশম্যাপ কী হিসাবে প্রান্ত স্থাপনের সময় একটি ত্রুটি নিক্ষেপ করে (ত্রুটিটি যেটি ফেলেছে তার অর্থ জানি না)

এবং যদি আপনি মনে করেন, আপনি কী হিসাবে আদিম তৈরি করে মানচিত্রের কার্যকারিতাটি দ্রুত তৈরি করতে পারেন, এখানে ফাস্টআপিল নামে একটি গ্রন্থাগার রয়েছে রয়েছে যা হিসাবে বাস্তবায়ন করে থাকে।

এ কারণে এটি হাশম্যাপের চেয়ে অনেক দ্রুত


1
না, আদিম ধরণের অনুমতি না দেওয়ার মূল কারণ জাভাতে টাইপ ইরেজোর , যা সংকলনের সময় কার্যকরভাবে Map<Integer, String>রূপান্তরিত Map<Object, Object>হয়। বিটিডাব্লু, এখানে আইডেন্টিটি হ্যাশম্যাপ রয়েছে যা ==সমতা যাচাইয়ের জন্য অপারেটর ব্যবহার করে, যে এখনও আদিম ধরণের অনুমতি দেয় না।
ইয়ুরি এন।

3

হাশম্যাপ আর্গুমেন্ট হিসাবে আদিম ডেটা ধরণের অনুমতি দেয় না। এটি কেবলমাত্র জিনিসগুলি গ্রহণ করতে পারে

HashMap<int, myObject> myMap = new HashMap<int, myObject>();

কাজ করবে না.

আপনাকে এই ঘোষণাটি পরিবর্তন করতে হবে

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

এমনকি আপনি যখন নিম্নলিখিতটি করেন তখনও

myMap.put(2,myObject);

আদিম ডাটা টাইপটি একটি পূর্ণসংখ্যার অবজেক্টে স্বয়ংক্রিয়ভাবে তৈরি হয়।

8 (int) === boxing ===> 8 (Integer)

আপনি এখানে autoboxing উপর আরও পড়তে পারেন http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html



1

অবজেক্ট হিসাবে প্রিমিটিভ টাইপ না হিসাবে ইন্ট ব্যবহার করুন

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

আমি হ্যাশম্যাপ <পূর্ণসংখ্যা, মাইবজেক্ট> মাইম্যাপ = নতুন হ্যাশম্যাপ <পূর্ণসংখ্যা, মাইবজেক্ট> () লিখেছি; তবে> এবং <ভাল উত্তর প্রদর্শন করতে আমার সমস্যা তৈরি করছে
franki3xe

আমি এটি টাইপ করা বেদনাদায়ক জানি কিন্তু আমি আপনাকে অবিলম্বে থেকে বাঁচানোর চেষ্টা করছিলাম -1। আমি অন্যদের দণ্ড দেওয়ার আগে মন্তব্য পছন্দ করি না (আমি আপনাকে -1 করিনি)।
অ্যাডাম জেন্ট


0

আমার কেন মাত্রা যুক্ত করা উচিত তা বুঝতে পারছি না (যেমন: অ্যারেতে প্রান্ত তৈরি করা) যেহেতু আমাকে কেবল কী হিসাবে একটি অঙ্ক সঞ্চয় করতে হবে।

একটি অ্যারের এছাড়াও একটি অবজেক্ট, তাই HashMap<int[], MyObject> একটি বৈধ কনস্ট্রাক্ট যা কী হিসাবে ইন্টে অ্যারে ব্যবহার করে।

সংকলক আপনি কী চান বা আপনার কী প্রয়োজন তা জানে না, এটি কেবলমাত্র এমন একটি ভাষা নির্মাণ দেখায় যা প্রায় সঠিক, এবং এটির জন্য সম্পূর্ণরূপে সঠিক হওয়ার জন্য কী অনুপস্থিত তা সতর্ক করে দেয়।


1
এটি সম্পর্কে সতর্কতা অবলম্বন করুন, একটি অ্যারের হ্যাশ মান এর বিষয়বস্তুর সাথে সম্পর্কিত নয়, সুতরাং একই বিষয়বস্তুযুক্ত দুটি অ্যারে হ্যাশ করতে পারে এটি একটি খুব দুর্বল কী হিসাবে আলাদা মানকে হ্যাশ করতে পারে।
john16384

0

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

import org.eclipse.collections.impl.map.mutable.primitive.IntObjectHashMap;

public class Check {
    public static void main(String[] args) {
        IntObjectHashMap map = new IntObjectHashMap();

        map.put(5,"It works");
        map.put(6,"without");
        map.put(7,"boxing!");

        System.out.println(map.get(5));
        System.out.println(map.get(6));
        System.out.println(map.get(7));
    }
}

এই উদাহরণে উপরের ইনটোবজেক্টহ্যাশম্যাপ

আপনার যেমন অন্তঃ> অবজেক্ট ম্যাপিং দরকার, YourObjectType[]অ্যারের ব্যবহার বিবেচনা করুন বা List<YourObjectType>সূচক অনুসারে অ্যাক্সেস মানগুলি বিবেচনা করুন , যেমন প্রকৃতি অনুসারে সূচক অনুসারে ইন্ট টাইপ সহ একটি এসোসিয়েটিভ অ্যারে।

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