jdk - java download 64 bit



পুনরাবৃত্তি এবং একটি মানচিত্র থেকে মুছে ফেলা (8)

আমি করছিলাম:

for (Object key : map.keySet())
    if (something)
        map.remove(key);

যা একটি কনকুরেন্ট মডিফিকেশন এক্সচেপশন ছুড়ে ফেলেছে, তাই আমি এটি এটিকে পরিবর্তন করেছি:

for (Object key : new ArrayList<Object>(map.keySet()))
    if (something)
        map.remove(key);

এই, এবং মানচিত্র সংশোধন যে অন্য কোন পদ্ধতি সিঙ্ক্রোনাইজ ব্লক হয়।

একটি ভাল সমাধান আছে?

যদি কেউ কোনও ভাল সমাধান নিয়ে আসে তবে প্রথমে বলার জন্য টিক পায় না;)

https://ffff65535.com


একটি ভাল সমাধান আছে?

আচ্ছা, স্পষ্টভাবে, একক বিবৃতিতে এটি করার একটি ভাল উপায় রয়েছে, তবে এটি যে উপাদানগুলি সরানো হয় তার উপর ভিত্তি করে শর্তে নির্ভর করে।

উদাহরণস্বরূপ: value পরীক্ষা যেখানে সব উপাদান মুছে ফেলুন, তারপর নীচের ব্যবহার করুন:

map.values().removeAll(Collections.singleton("test"));

আপডেট জাভা 8 এ ল্যাম্বা এক্সপ্রেশন ব্যবহার করে এটি একটি লাইনে করা যেতে পারে।

map.entrySet().removeIf(e-> <boolean expression> );

আমি জানি এই প্রশ্নটি খুব পুরানো, কিন্তু জিনিসগুলি করার আরও ভাল উপায় আপডেট করার কোনো ক্ষতি নেই :)


আপনি একটি মানচিত্র travering যখন উপাদান নিরাপদে মুছে ফেলার জন্য Iterator ব্যবহার করতে হবে।


একটি বাস্তব ইটারারেটর ব্যবহার করুন।

Iterator<Object> it = map.keySet().iterator();

while (it.hasNext())
{
  it.next();
  if (something)
    it.remove();
 }

প্রকৃতপক্ষে, আপনি যে কাজটি করতে entrySet() পরিবর্তে entrySet() পুনরাবৃত্তি করতে হতে পারে।


একটি বিকল্প, আরো verbose উপায়

List<SomeObject> toRemove = new ArrayList<SomeObject>();
for (SomeObject key: map.keySet()) {
    if (something) {
        toRemove.add(key);
    }
}

for (SomeObject key: toRemove) {
    map.remove(key);
}

এবং এই ভাল কাজ করা উচিত ..

ConcurrentMap<Integer, String> running = ... create and populate map

Set<Entry<Integer, String>> set = running.entrySet();    

for (Entry<Integer, String> entry : set)
{ 
  if (entry.getKey()>600000)
  {
    set.remove(entry);    
  }
}

জাভা 8 পুনরাবৃত্তি আরও একটি ঘোষণামূলক পদ্ধতির সমর্থন করে, যাতে আমরা এটি গণনা করার পরিবর্তে আমরা যে ফলাফলটি চাই তা উল্লেখ করি। নতুন পদ্ধতির উপকারিতা এটি আরও পাঠযোগ্য, কম ত্রুটি প্রবণ হতে পারে।

public static void mapRemove() {

    Map<Integer, String> map = new HashMap<Integer, String>() {
        {
            put(1, "one");
            put(2, "two");
            put(3, "three");
        }
    };

    map.forEach( (key, value) -> { 
        System.out.println( "Key: " + key + "\t" + " Value: " + value );  
    }); 

    map.keySet().removeIf(e->(e>2)); // <-- remove here

    System.out.println("After removing element");

    map.forEach( (key, value) -> { 
        System.out.println( "Key: " + key + "\t" + " Value: " + value ); 
    });
}

এবং ফলাফল নিম্নরূপ:

Key: 1   Value: one
Key: 2   Value: two
Key: 3   Value: three
After removing element
Key: 1   Value: one
Key: 2   Value: two

হয়তো আপনি মানচিত্রের উপর পুনরাবৃত্তি করতে পারেন এবং একটি পৃথক সংগ্রহে সেগুলি সংরক্ষণ করার জন্য কী খুঁজতে চান। তারপর মানচিত্র থেকে কী সংগ্রহ মুছে ফেলুন। পুনরাবৃত্তি যখন মানচিত্র সংশোধন করা হয় সাধারণত উপর frowned। মানচিত্রটি যদি খুব বড় হয় তবে এই ধারণাটি সন্দেহভাজন হতে পারে।


ConcurrentHashMap

আপনি java.util.concurrent.ConcurrentHashMap ব্যবহার করতে পারেন।

এটি ConcurrentMap (যা Map ইন্টারফেস প্রসারিত করে) প্রয়োগ করে।

যেমন :

Map<Object, Content> map = new ConcurrentHashMap<Object, Content>();

for (Object key : map.keySet()) {
    if (something) {
        map.remove(key);
    }
}

এই পদ্ধতির আপনার কোড untouched ছেড়ে। শুধুমাত্র map ধরন ভিন্ন।





java