একটি হ্যাশসেট / হ্যাশম্যাপে একটি সদৃশ মান যুক্ত করে পূর্ববর্তী মানটি প্রতিস্থাপন করে


137

নীচের কোডটির টুকরোটি বিবেচনা করুন:

HashSet hs = new HashSet();
hs.add("hi"); -- (1)
hs.add("hi"); -- (2)

hs.size()HashSetসদৃশকে অনুমতি দেয় না হিসাবে 1 দেবে তাই কেবল একটি উপাদান সংরক্ষণ করা হবে।

আমি জানতে চাই যে আমরা সদৃশ উপাদান যুক্ত করি, তবে এটি কি পূর্ববর্তী উপাদানটিকে প্রতিস্থাপন করে বা এটি কেবল এটি যুক্ত করে না?

এছাড়াও, HashMapএকই ক্ষেত্রে ব্যবহার করে কী ঘটবে ?

উত্তর:


246

এর ক্ষেত্রে HashMapএটি পুরানো মানটিকে নতুনের সাথে প্রতিস্থাপন করে।

এর ক্ষেত্রে HashSetআইটেমটি sertedোকানো হয়নি।


1
আমি কী মিস করছি তা নিশ্চিত নই, তবে উত্স কোডটি অন্যথায় নির্দেশিত বলে মনে হচ্ছে? আমি দেখতে যে তারা ব্যাকিং উপর একটি চেক করবেন না HashMapকিনা তা দেখতে keyইতিমধ্যে কল করার আগে বিদ্যমান putব্যাকিং উপর map?
মাইস্টেরাকস

10
@ মাইস্টারকস: মূলটি হ'ল উপাদান Setএবং এটি কখনও put()অপারেশন দ্বারা প্রতিস্থাপন হয় না ।
কেপিল

1
আহ আমি এখন এটি পেতে। আমি বুঝতে পেরেছি যে কীটি মূল উপাদান Set, তবে কেবল বুঝতে পেরেছি যে put()কীটি নয়, কেবল মানটিকে ওভাররাইড করবে। এই ক্ষেত্রে, এটি আবার কীটির পাশাপাশি একই মান দেওয়া হয়েছে যা কীটি উপস্থিত রয়েছে কিনা তা যাচাই বাছাই করার চেয়ে ভাল নাও হতে পারে। যেভাবেই হোক না কেন, আমি বুঝতে পারি যে এটি কীভাবে কাজ করে।
মাইস্টেরাকস

শুধু কৌতূহল, কেন হ্যাশম্যাপ এবং হ্যাশসেট এমন হতে পারে?
হেলিন ওয়াং

@ হেলিনওয়াং: আমি মনে করি না যে এটি পরিকল্পনা করা হয়েছিল, আমি মনে করি এটি একটি HashSetরূপে বাস্তবায়নের একটি প্রভাব মাত্র HashMap। যদিও আপনি ক্লাসগুলির বিকাশকারীদের একজন না হন তা জানা মুশকিল।
কেপিল

47

আপনাকে প্রথমে জানতে হবে এটি হ'ল HashSetএকটি এর মতো কাজ করে Setযার অর্থ আপনি আপনার অবজেক্টকে সরাসরি যুক্ত করেন HashSetএবং এতে নকল থাকতে পারে না। আপনি কেবল নিজের মানটি সরাসরি এতে যুক্ত করুন HashSet

তবে HashMapএটি এক Mapপ্রকারের। এর অর্থ প্রতিবার আপনি যখন একটি এন্ট্রি যুক্ত করবেন আপনি একটি কী-মান জুটি যুক্ত করবেন।

এতে HashMapআপনার সদৃশ মান থাকতে পারে তবে কী নকল নয়। ইন HashMapনতুন এন্ট্রি পুরানো এক প্রতিস্থাপন করবে। সবচেয়ে সাম্প্রতিক এন্ট্রি হবে HashMap

হ্যাশম্যাপ এবং হ্যাশসেটের মধ্যে বোঝার লিঙ্ক:

মনে রাখবেন, HashMapসদৃশ কী থাকতে পারে না। দৃশ্যের পিছনে HashSetHashMap

আপনি যখন কোনও বস্তুকে একটিতে যুক্ত করার চেষ্টা করেন HashSet, এই প্রবেশটি আসলে একটি কী হিসাবে সংরক্ষণ করা হয় HashMap- যা একই HashMapদৃশ্যের পিছনে ব্যবহৃত হয় HashSet। যেহেতু এই অন্তর্নিহিতটির HashMapএকটি মূল-মান জুড়ি প্রয়োজন, তাই আমাদের জন্য একটি ডামি মান তৈরি করা হয়।

এখন যখন আপনি HashSetএটির মধ্যে অন্য সদৃশ বস্তুটি সন্নিবেশ করানোর চেষ্টা করবেন তখন এটি আবার HashMapনীচে থাকা কোনও কী হিসাবে এটি sertোকানোর চেষ্টা করবে। তবে HashMapসদৃশ সমর্থন করে না। সুতরাং, HashSetএখনও সেই ধরণের একমাত্র মান থাকার ফলস্বরূপ। পার্শ্ব নোট হিসাবে, প্রতিটি ডুপ্লিকেট কী জন্য, যেহেতু হ্যাশসেটে আমাদের প্রবেশের জন্য উত্পন্ন মানটি কিছু এলোমেলো / ডামি মান, তাই কীটি মোটেই প্রতিস্থাপন করা হয়নি। কীটি সরিয়ে ফেলা এবং একই কীটি (ডামি মান একই) যুক্ত করার ফলে এটিকে মোটেই বোঝা যাবে না।

সারসংক্ষেপ:

HashMapসদৃশ অনুমতি দেয় values, কিন্তু না keysHashSetসদৃশ থাকতে পারে না

বা না একটি বস্তুর উপরন্তু সফলভাবে সম্পূর্ণ হয় কিনা সঙ্গে খেলা করার জন্য, আপনাকে পরীক্ষা করতে পারবেন booleanফিরে আপনি কল যখন মান .add() এবং দেখুন এটি ফেরৎ trueবা false। যদি এটি ফিরে আসে তবে এটি serted trueোকানো হত।


HashMap allows duplicate valuesহ্যাশম্যাপ পুরানো মানটিকে নতুনের সাথে প্রতিস্থাপন করে।
অ্যালেক্স 78191

20

ডক্স এই চমত্কার স্পষ্ট: HashSet.add না প্রতিস্থাপন করুন:

ইতিমধ্যে উপস্থিত না থাকলে এই সেটটিতে নির্দিষ্ট উপাদান যুক্ত করে। আরও আনুষ্ঠানিকভাবে, এই সেটটিতে নির্দিষ্ট উপাদান ই যুক্ত করে যদি এই সেটে কোনও উপাদান ই 2 থাকে না (e == নাল? E2 == নাল: e.equals (e2))। যদি এই সেটটিতে ইতিমধ্যে উপাদান রয়েছে, কলটি সেটটি অপরিবর্তিত রেখে দেয় এবং মিথ্যা প্রত্যাবর্তন করে।

তবে প্রতিস্থাপন করবে :HashMap.put

যদি মানচিত্রে আগে কীটির জন্য ম্যাপিং থাকে তবে পুরানো মানটি প্রতিস্থাপন করা হবে।


4

এটি হ্যাশসেটের ক্ষেত্রে এটি প্রতিস্থাপন করে না।

ডক্স থেকে:

http://docs.oracle.com/javase/6/docs/api/java/util/HashSet.html#add(E )

"ইতিমধ্যে উপস্থিত না থাকলে এই সেটটিতে নির্দিষ্ট উপাদান যুক্ত করে More আরও আনুষ্ঠানিকভাবে, এই সেটটিতে নির্দিষ্ট উপাদান ই যুক্ত করে যদি এই সেটে কোনও উপাদান ই 2 থাকে না (e == নাল? E2 == নাল: e.equals ( e2))। যদি এই সেটে ইতিমধ্যে উপাদান রয়েছে, কলটি সেটটি অপরিবর্তিত রেখে দেয় এবং মিথ্যা প্রত্যাবর্তন করে ""


1

আমি ভুল হলে আমাকে সংশোধন করুন তবে আপনি যা পেয়ে যাচ্ছেন তা হ'ল হাই "==" হাই "সর্বদা সত্য হয় না (কারণ তারা অগত্যা একই জিনিস নয়)।

যদিও আপনি 1 এর উত্তর পাচ্ছেন তার কারণ হ'ল JVM স্ট্রিং অবজেক্টগুলিকে পুনরায় ব্যবহার করবে where এই ক্ষেত্রে জেভিএম স্ট্রিং অবজেক্টটি পুনরায় ব্যবহার করছে এবং এভাবে হাশম্যাপ / হ্যাশসেটে আইটেমটি ওভাররাইট করছে।

তবে আপনি এই আচরণের গ্যারান্টিযুক্ত নন (কারণ এটি একটি ভিন্ন স্ট্রিং অবজেক্ট হতে পারে যার একই মান "হাই" থাকে)। আপনি যে আচরণটি দেখছেন তা কেবল জেভিএমের অপ্টিমাইজেশনের কারণে।


0

হ্যাশ ম্যাপের হ্যাশসেট ব্যাক আপ হওয়ার কারণে আপনাকে প্রথমে হ্যাশ মানচিত্রে পুট পদ্ধতিটি পরীক্ষা করতে হবে

  1. আপনি যখন সদৃশ মান যুক্ত করবেন তখন হ্যাশসেটে একটি স্ট্রিং "ওয়ান" বলুন,
  2. একটি এন্ট্রি ("একটি", বর্তমান) হাশম্যাপে প্রবেশ করানো হবে (সেটটিতে যুক্ত সমস্ত মানের জন্য মানটি "বর্তমান" হবে যা যদি অবজেক্ট টাইপ করে)
  3. হাশম্যাপ মানচিত্রে এন্ট্রি যুক্ত করে এবং মানটি ফিরিয়ে দেয়, যা "PRESENT" এ ক্ষেত্রে হয় বা এন্ট্রি না থাকলে শূন্য হয়।
  4. হ্যাশসেটের অ্যাড পদ্ধতিটি যদি হ্যাশম্যাপের থেকে প্রাপ্ত মানটি শূন্যের সমান হয় তবে অন্যটি মিথ্যা, যার অর্থ একটি এন্ট্রি ইতিমধ্যে বিদ্যমান ...

0

এটি আলাদাভাবে বলতে: আপনি যখন একটি হ্যাশম্যাপে কী-মান-জুটি সন্নিবেশ করান যেখানে কীটি ইতিমধ্যে বিদ্যমান (এক অর্থে হ্যাশভ্যালু () একই মান দেয় তবে সমান () সত্য হয় তবে দুটি বস্তু এখনও বিভিন্ন উপায়ে পৃথক হতে পারে ), কীটি প্রতিস্থাপন করা হয়নি তবে মানটি ওভাররাইট করা হয়েছে। কীটি কেবল হ্যাশভ্যালু () পেতে এবং এর সাথে সারণীতে মানটি ব্যবহার করতে ব্যবহৃত হয়। যেহেতু হ্যাশসেট একটি হ্যাশম্যাপের কীগুলি ব্যবহার করে এবং স্বেচ্ছাচারিত মানগুলি নির্ধারণ করে যা ফলস্বরূপ (ব্যবহারকারীর কাছে) কিছু যায় আসে না সেটের উপাদানগুলির স্থানগুলিও প্রতিস্থাপন করা হয় না।


0

HashMapমূলত রয়েছে Entryযা পরবর্তীতে রয়েছে Key(Object)এবং Value(Object).Internally HashSetহয় HashMapএবং HashMapতোমাদের মধ্যে কেউ কেউ যেমন মান ইতিমধ্যে প্রতিস্থাপন না pointed..but এটা সত্যিই কী ??? কোন প্রতিস্থাপন ..এবং যে এখানে কৌতুক গ্রহণ করেন। HashMapঅন্তর্নিহিতের মূল হিসাবে এটির মান রাখেHashMap এবং মানটি একটি ডামি অবজেক্ট। তাই আপনি যদি হ্যাশম্যাপে (একই অন্তর্নিহিত মানচিত্রে) একই মানটি পুনরায় স্থাপন করার চেষ্টা করেন তবে এটি কেবল ডামি মানটি প্রতিস্থাপন করে এবং কী (হ্যাশসেটের মান) না।

হ্যাশসেট ক্লাসের জন্য নীচের কোডটি দেখুন:

public boolean  [More ...] add(E e) {

   return map.put(e, PRESENT)==null;
}

এখানে ই হ্যাশসেটের মান তবে অন্তর্নিহিত মানচিত্রের কী। এবং কী কখনও প্রতিস্থাপন হয় না is আশা করি আমি বিভ্রান্তি দূর করতে সক্ষম হয়েছি।

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