জাভা: হ্যাশম্যাপ <স্ট্রিং, ইনট> কাজ করছে না


128

HashMap<String, int>কাজ বলে মনে হচ্ছে না তবে HashMap<String, Integer>কাজ করে। কোন ধারণা কেন?


আপনার প্রশ্নের জন্য শব্দগুলির আপনার পছন্দটি বিভ্রান্তিকর, আপনি কি স্পষ্ট করে বলতে পারেন? এবং ঠিক কি কাজ করছে না, আপনি কোড পোস্ট করতে পারেন?
অ্যান্টনি ফোরলনি

উত্তর:


203

আপনি জাভাতে জেনেরিক আর্গুমেন্ট হিসাবে আদিম ধরণের ব্যবহার করতে পারবেন না। পরিবর্তে ব্যবহার করুন:

Map<String, Integer> myMap = new HashMap<String, Integer>();

সঙ্গে স্বয়ংক্রিয় বক্সিং / আনবক্সিং সেখানে কোডে সামান্য পার্থক্য আছে। অটো-বক্সিং মানে আপনি লিখতে পারেন:

myMap.put("foo", 3);

পরিবর্তে:

myMap.put("foo", new Integer(3));

অটো-বক্সিং মানে প্রথম সংস্করণ স্পষ্টভাবে দ্বিতীয়টিতে রূপান্তরিত হয়। স্ব-আনবক্সিং মানে আপনি লিখতে পারেন:

int i = myMap.get("foo");

পরিবর্তে:

int i = myMap.get("foo").intValue();

অন্তর্নিহিত কলটির intValue()অর্থ কীটি না পাওয়া গেলে এটি একটি উত্পন্ন করবে NullPointerException, উদাহরণস্বরূপ:

int i = myMap.get("bar"); // NullPointerException

কারণ মুছে ফেলা টাইপ । বিপরীতে, বলুন, সি # জেনেরিক ধরণের রানটাইম ধরে রাখা হয় না। আপনাকে কেবল এটি করা থেকে বাঁচাতে সুস্পষ্ট কাস্টিংয়ের জন্য তারা কেবল "সিনট্যাকটিক চিনি":

Integer i = (Integer)myMap.get("foo");

আপনাকে উদাহরণ দেওয়ার জন্য, এই কোডটি পুরোপুরি আইনী:

Map<String, Integer> myMap = new HashMap<String, Integer>();
Map<Integer, String> map2 = (Map<Integer, String>)myMap;
map2.put(3, "foo");

3
আপনার শেষ উদাহরণটি কাজ করে না: মানচিত্র <স্ট্রিং, পূর্ণসংখ্যা> থেকে মানচিত্রে <পূর্ণসংখ্যা, স্ট্রিং>
T3rm1

একটি নতুন লাইনে প্রতিটি পৃথক কোড বিবেচনা করে, লাইন 5-তে কোডটি প্রথমে intValue () পদ্ধতিটি ব্যবহার করার আগে পূর্ণসংখ্যায় কাস্ট করা আবশ্যক কারণ আপনি get () পদ্ধতিটি ব্যবহার করার সময় এটি একটি অবজেক্ট হিসাবে বিবেচিত হবে।
তাজা


2

আপনি আদিম ধরণের ব্যবহার করতে পারবেন না HashMapint, বা doubleকাজ না। আপনাকে এর ঘেরের প্রকারটি ব্যবহার করতে হবে। একটি উদাহরণ জন্য

Map<String,Integer> m = new HashMap<String,Integer>();

এখন দুটিই বস্তু, সুতরাং এটি কাজ করবে।


0

ইন্টটি একটি আদিম ধরণ, আপনি এখানে জাভাতে আদিম ধরণের অর্থ কী তা পড়তে পারেন এবং মানচিত্রটি একটি ইন্টারফেস যা ইনপুট হিসাবে অবজেক্টগুলির মধ্যে রয়েছে:

public interface Map<K extends Object, V extends Object>

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

Map<String, Integer> map = new HashMap<>();

অথবা

Map<String, int[]> map = new HashMap<>();
int x = 1;

//put x in map
int[] x_ = new int[]{x};
map.put("x", x_);

//get the value of x
int y = map.get("x")[0];

-3

আপনি জেনেরিক আর্গুমেন্টে রেফারেন্স টাইপ ব্যবহার করতে পারেন, আদিম ধরণের নয়। সুতরাং এখানে আপনার ব্যবহার করা উচিত

Map<String, Integer> myMap = new HashMap<String, Integer>();

এবং স্টোর মান হিসাবে

myMap.put("abc", 5);

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