জাভাতে একটি হ্যাশম্যাপে নাল কী বা মান যুক্ত করার ব্যবহার কী?


91

হ্যাশম্যাপ একটি নাল কী এবং যে কোনও নাল মানকে অনুমতি দেয়। এর ব্যবহার কী?


11
"সম্ভবত সমস্যাটি এমন নয় যে কোনও কিছুই আমাদের বিরক্ত করছে না, তবে আমরা এটিই বিরক্ত করছি" "
bmargulies

4
গুয়ারা, গুগল সংগ্রহগুলিতে, অনেক ক্লাস শূন্য করতে দেয় না এবং এর পিছনে যুক্তিটি হ'ল 95% কেস নালার প্রয়োজন নেই এবং তারা বাগগুলি উপস্থাপন করতে পারেন, এটি সম্ভবত খুঁজে পাওয়া শক্ত।
স্টিভ্লো

আশ্চর্যের বিষয় হ'ল এটি ConcurrentHashMapনাল-কীগুলি সমর্থন করে না, যখন HashMapতা করে।
কোডেবল

4
কেবলমাত্র হ্যাশম্যাপ নাল :)
সুভাষিস

উত্তর:


126

আপনি যা জিজ্ঞাসা করছেন তা আমি ইতিবাচক নই, তবে আপনি যখন কোনও নাল কী ব্যবহার করতে চান তার উদাহরণ সন্ধান করেন, আমি ডিফল্ট কেসটি উপস্থাপন করতে মানচিত্রে প্রায়শই এগুলি ব্যবহার করি (যেমন মানটি ব্যবহার করা উচিত) যদি প্রদত্ত কীটি উপস্থিত না থাকে):

Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);

HashMapনাল কীগুলি বিশেষভাবে পরিচালনা করে (যেহেতু এটি .hashCode()কোনও নাল বস্তুর উপরে কল করতে পারে না ), তবে নাল মানগুলি বিশেষ কিছু নয়, সেগুলি অন্য কোনও মতো মানচিত্রে সঞ্চিত রয়েছে


4
সুতরাং যদি .hashCode () নাল উপর সম্ভব না হয় তবে কে সিদ্ধান্ত নেবে যে নাল কীটি প্রবেশ করবে?
পেসারিয়ার

26
@ পেসারিয়ায় HashMap( putForNullKey) এর একটি বিশেষ পদ্ধতি রয়েছে যা এটি পরিচালনা করে; এটি এটি টেবিল 0 এ সঞ্চয় করে
মাইকেল মরোজেক

4
@ মিশেলমরোজেক আপনার শেষ লাইনে B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);আমি মনে করি যে আমরা অনুসন্ধান কীতে সহজ পদ্ধতিটি কল করতে পারি যার ফলস্বরূপ ফলাফল হবে। B val = foo.get(search);আমি কিছু ভুল হয়ে থাকলে দয়া করে আমাকে সংশোধন করতে পারেন?
ধীররাজরাজ

6
@ dheeraj92 আপনার কোড সেট হবে valথেকে nullযদি চাবি অস্তিত্ব নেই; খনি nullমানচিত্রে যা মানচিত্রে সেট করে । এটিই ছিল, আমি nullমানচিত্রে
কীটিতে

28

একটি উদাহরণ গাছ মডেলিং জন্য হবে। আপনি যদি গাছের কাঠামোর প্রতিনিধিত্ব করতে একটি হ্যাশম্যাপ ব্যবহার করছেন, যেখানে কীটি পিতামাতার এবং মানটি বাচ্চাদের তালিকার তালিকা, তবে nullকীটির মানগুলি হ'ল মূল নোড।


6

null মানগুলির ব্যবহারের একটি উদাহরণ হ'ল কHashMap ব্যয়বহুল অপারেশনের ফলাফলের জন্য ক্যাশে হিসাবে (যেমন কোনও বাহ্যিক ওয়েব পরিষেবাতে কল) যা ফিরে আসতে পারে null

nullমানচিত্রে একটি মান রাখার পরে আপনি কেস প্রদত্ত কী ( cache.containsKey(someKey)রিটার্ন false) এর জন্য অপারেশন করা হয়নি এমন ক্ষেত্রে এবং যেখানে অপারেশনটি সম্পন্ন হয়েছে তবে একটি nullমান cache.containsKey(someKey)ফেরত দিয়েছে ( রিটার্ন true, cache.get(someKey)রিটার্ন ) এর মধ্যে পার্থক্য করতে দেয়null ) ।

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


3

উত্তরগুলি এখনও অবধি কেবল একটি nullকী আছে তার মূল্য বিবেচনা করে তবে প্রশ্নটিও জিজ্ঞাসা করে any number of null values

nullএকটি হ্যাশম্যাপে একটি কীটির সাথে মান সংরক্ষণ করার সুবিধা ডাটাবেস ইত্যাদির মতোই - আপনি খালি (যেমন স্ট্রিং "") থাকা এবং একটি মান না রাখার মধ্যে পার্থক্য রেকর্ড করতে পারেন (নাল) ।


2

nullকীটি কার্যকর হতে পারে সেই ক্ষেত্রে আমার একমাত্র-কিছুটা-চুক্তিবদ্ধ উদাহরণ :

public class Timer {
    private static final Logger LOG = Logger.getLogger(Timer.class);
    private static final Map<String, Long> START_TIMES = new HashMap<String, Long>();

    public static synchronized void start() {
        long now = System.currentTimeMillis();
        if (START_TIMES.containsKey(null)) {
            LOG.warn("Anonymous timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(null).longValue()) +"ms"); 
        }
        START_TIMES.put(null, now);
    }

    public static synchronized long stop() {
        if (! START_TIMES.containsKey(null)) {
            return 0;
        }

        return printTimer("Anonymous", START_TIMES.remove(null), System.currentTimeMillis());
    }

    public static synchronized void start(String name) {
        long now = System.currentTimeMillis();
        if (START_TIMES.containsKey(name)) {
            LOG.warn(name + " timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(name).longValue()) +"ms"); 
        }
        START_TIMES.put(name, now);
    }

    public static synchronized long stop(String name) {
        if (! START_TIMES.containsKey(name)) {
            return 0;
        }

        return printTimer(name, START_TIMES.remove(name), System.currentTimeMillis());
    }

    private static long printTimer(String name, long start, long end) {
        LOG.info(name + " timer ran for " + (end - start) + "ms");
        return end - start;
    }
}

যদি আপনি কোনও অস্তিত্বহীন টাইমার বা ইতিমধ্যে বন্ধ করা একটি থামানোর চেষ্টা করছেন, তবে এটি একটি ত্রুটি হওয়া উচিত, উপেক্ষা করা উচিত নয়।
মনিকার লসুইট

@ কিপ্যায়েট্যাক্সস - আপনার অভিপ্রায় নির্ভর করে। আপনি যদি সহজেই ব্যবহার করা যেতে পারে এমন একটি হালকা ওজনীয় ইউটিলিটি চান তবে আপনি সাধারণত এর আশেপাশে যেতে চান নাthrow Exception । তদুপরি, এটি অস্তিত্বহীন বা ইতিমধ্যে বন্ধ হওয়া টাইমারকে থামানোর চেষ্টা করার মতো নয় যা কলকারী সাধারণত পুনরুদ্ধার করতে পারে।
aroth

1

অন্য উদাহরণ: আমি তারিখ অনুসারে এটি ডেটা গোষ্ঠী করতে ব্যবহার করি। তবে কিছু তথ্যের তারিখ নেই। আমি এটি শিরোনাম "NoDate" এর সাথে গ্রুপ করতে পারি


0

মানচিত্র কী সিমের ক্ষেত্রের প্রতিনিধিত্ব করে যেখানে ইউআই নির্বাচনের জন্য ডেটা সঞ্চয় করে তখন নাল কীটিও সহায়ক হতে পারে।

একটি সম্পর্কিত নাল ক্ষেত্রের মান উদাহরণস্বরূপ ইউআই নির্বাচনের "(দয়া করে নির্বাচন করুন)" হিসাবে উপস্থাপন করা হবে।

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