অতিরিক্ত আকারের উপাদানগুলি সরিয়ে এমন কোনও স্থির আকারের সারি রয়েছে?


127

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

জাভাতে এটির জন্য কি কোনও বিদ্যমান বাস্তবায়ন রয়েছে?


উত্তর:


19

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

আবার, কারণ সমস্ত সারি AbstractQueue এর সন্তান, কেবল আপনার অভ্যন্তরীণ ডেটা টাইপ হিসাবে এটি ব্যবহার করুন এবং আপনার কোনও কার্যকরী সময় নেই: নমনীয় বাস্তবায়ন হওয়া উচিত :-)

হালনাগাদ:

নীচে বর্ণিত হিসাবে, দুটি উন্মুক্ত বাস্তবায়ন উপলব্ধ (এই উত্তরটি বেশ পুরানো, ভাবেন!), বিশদটির জন্য এই উত্তরটি দেখুন।


4
অ্যাবস্ট্রাক্ট কিউয়ের পরিবর্তে সারি ব্যবহার করুন ... এমন কাত থাকতে পারে যা ইন্টারফেস প্রয়োগ করে তবে বিমূর্ত শ্রেণিটি প্রসারিত করে না।
তোফুবিয়ার

1
পাইথনে আপনি collection.dequeএকটি নির্দিষ্ট একটি ব্যবহার করতে পারেন maxlen
জোনাস গ্রাগার

2
আপডেট এখানে এখন যেমন দুটি ক্লাস উপলব্ধ। আপনার নিজের লেখার দরকার নেই। এই পৃষ্ঠায় আমার উত্তর দেখুন ।
বাসিল বাউরক

107

আসলে লিঙ্কডহ্যাশম্যাপ আপনি যা চান ঠিক তেমন করে। আপনাকে removeEldestEntryপদ্ধতিটি ওভাররাইড করতে হবে ।

সর্বোচ্চ 10 টি উপাদান সহ একটি সারি উদাহরণ:

  queue = new LinkedHashMap<Integer, String>()
  {
     @Override
     protected boolean removeEldestEntry(Map.Entry<Integer, String> eldest)
     {
        return this.size() > 10;   
     }
  };

যদি "রিলেডএলস্টেস্ট্রি" সত্যটি প্রত্যাবর্তন করে তবে মানচিত্রে সর্বাধিক প্রবীণ এন্ট্রি সরানো হবে।


7
এটি আসলে একটি সারিতে যা করে তা করে না, কীভাবে আমি নতুনটি পুনরুদ্ধার করতে পারি। বস্তু?
অ্যালেক্স

69

হ্যাঁ, দুই

এই সঠিক উত্তরের সাথে আমার নিজের সদৃশ প্রশ্ন থেকে আমি দুটিটি শিখেছি:


আমি পেয়ারা উত্পাদনশীল ব্যবহার করেছি EvictingQueue, ভাল কাজ।

কোনও EvictingQueueকলকে তাত্ক্ষণিকভাবে স্থিতিশীল কারখানার পদ্ধতিতে কল করতে createএবং আপনার সর্বোচ্চ আকার নির্দিষ্ট করে specify

EvictingQueue< Person > people = com.google.common.collect.EvictingQueue.create( 100 ) ;  // Set maximum size to 100. 

... এবং আপনি যদি কমন্স কালেকশন ৪.০ ব্যবহার করতে না পারেন তবে সার্কুলারফাইফুফারটি v 3.0 এর মধ্যে সার্কুলারফাইফিউকিউয়ের মতো বলে মনে হচ্ছে।
শ্রীধর সারনোবাত

CircularFifoQueueলিঙ্কটি মারা গেছে, পরিবর্তে commons.apache.org/proper/commons-collections/apidocs/org/…
user7294900

@ user7294900 ধন্যবাদ, লিঙ্ক স্থির। এফওয়াইআই, স্ট্যাক ওভারফ্লো আপনাকে সরাসরি নিজের উত্তরের জন্য এই জাতীয় সম্পাদনা করার জন্য আমন্ত্রণ জানিয়েছে। যে কেউ সম্পাদনা করতে পারবেন, কেবল মূল লেখক নয়। স্ট্যাক ওভারফ্লো সেই বিষয়ে উইকিপিডিয়াদের মতো আরও অনেকের উদ্দেশ্যে।
বেসিল বাউরক

@ বাসিলবার্ক হ্যাঁ, তবে লিঙ্কগুলি ধূসর অঞ্চল হিসাবে পরিবর্তন করার পরেও এই জাতীয় সম্পাদনাগুলি আমার দ্বারা প্রত্যাখ্যান করা যেতে পারে
user7294900

18

আমি স্রেফ এইভাবে একটি নির্দিষ্ট আকারের সারিটি প্রয়োগ করেছি:

public class LimitedSizeQueue<K> extends ArrayList<K> {

    private int maxSize;

    public LimitedSizeQueue(int size){
        this.maxSize = size;
    }

    public boolean add(K k){
        boolean r = super.add(k);
        if (size() > maxSize){
            removeRange(0, size() - maxSize);
        }
        return r;
    }

    public K getYoungest() {
        return get(size() - 1);
    }

    public K getOldest() {
        return get(0);
    }
}

1
এটি হওয়া উচিতremoveRange(0, size() - maxSize)
আহমেদ হেগজি

@ আহমেদহেগজি অপসারণ রেঞ্জ (0, আকার () - ম্যাক্স সাইজ - 1) সঠিক
আশীষ দোনেরিয়া

আমি উপরের আহমেদের সাথে একমত অপসারণ করুন - ১. নইলে সর্বাধিক দক্ষতায় আপনি এমন একটি অ্যারের সাথে সমাপ্ত হবেন যেহেতু আমরা 0 ভিত্তিক কথা বলছি max এই ক্ষেত্রে. যদি সর্বোচ্চ আকার = 50 হয় তবে কোনও নতুন অবজেক্ট যুক্ত করার সময় আসল পোস্টে অপসারণের সূত্রটি 51 - 50 - 1 = 0 হবে (অর্থাত্ কোনও কিছুই সরানো হয়নি)।
এটপ

8

এটি আমি Queueমোড়ানো দিয়ে LinkedListযা করেছি, এটি স্থির আকারের যা আমি এখানে দিচ্ছি 2;

public static Queue<String> pageQueue;

pageQueue = new LinkedList<String>(){
            private static final long serialVersionUID = -6707803882461262867L;

            public boolean add(String object) {
                boolean result;
                if(this.size() < 2)
                    result = super.add(object);
                else
                {
                    super.removeFirst();
                    result = super.add(object);
                }
                return result;
            }
        };


....
TMarket.pageQueue.add("ScreenOne");
....
TMarket.pageQueue.add("ScreenTwo");
.....

4

আমি মনে করি আপনি যা বর্ণনা করছেন তা একটি বৃত্তাকার সারি। এখানে একটি উদাহরণ এবং এখানে একটি ভাল একটি


4

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

import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

public class LimitedQueue<T> implements Queue<T>, Iterable<T> {

    private final int limit;
    private final LinkedList<T> list = new LinkedList<T>();

    public LimitedQueue(int limit) {
        this.limit = limit;
    }

    private boolean trim() {
        boolean changed = list.size() > limit;
        while (list.size() > limit) {
            list.remove();
        }
        return changed;
    }

    @Override
    public boolean add(T o) {
        boolean changed = list.add(o);
        boolean trimmed = trim();
        return changed || trimmed;
    }

    @Override
    public int size() {
        return list.size();
    }

    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

    @Override
    public boolean contains(Object o) {
        return list.contains(o);
    }

    @Override
    public Iterator<T> iterator() {
        return list.iterator();
    }

    @Override
    public Object[] toArray() {
        return list.toArray();
    }

    @Override
    public <T> T[] toArray(T[] a) {
        return list.toArray(a);
    }

    @Override
    public boolean remove(Object o) {
        return list.remove(o);
    }

    @Override
    public boolean containsAll(Collection<?> c) {
        return list.containsAll(c);
    }

    @Override
    public boolean addAll(Collection<? extends T> c) {
        boolean changed = list.addAll(c);
        boolean trimmed = trim();
        return changed || trimmed;
    }

    @Override
    public boolean removeAll(Collection<?> c) {
        return list.removeAll(c);
    }

    @Override
    public boolean retainAll(Collection<?> c) {
        return list.retainAll(c);
    }

    @Override
    public void clear() {
        list.clear();
    }

    @Override
    public boolean offer(T e) {
        boolean changed = list.offer(e);
        boolean trimmed = trim();
        return changed || trimmed;
    }

    @Override
    public T remove() {
        return list.remove();
    }

    @Override
    public T poll() {
        return list.poll();
    }

    @Override
    public T element() {
        return list.element();
    }

    @Override
    public T peek() {
        return list.peek();
    }
}

3
public class CircularQueue<E> extends LinkedList<E> {
    private int capacity = 10;

    public CircularQueue(int capacity){
        this.capacity = capacity;
    }

    @Override
    public boolean add(E e) {
        if(size() >= capacity)
            removeFirst();
        return super.add(e);
    }
}

ব্যবহার এবং পরীক্ষার ফলাফল:

public static void main(String[] args) {
    CircularQueue<String> queue = new CircularQueue<>(3);
    queue.add("a");
    queue.add("b");
    queue.add("c");
    System.out.println(queue.toString());   //[a, b, c]

    String first = queue.pollFirst();       //a
    System.out.println(queue.toString());   //[b,c]

    queue.add("d");
    queue.add("e");
    queue.add("f");
    System.out.println(queue.toString());   //[d, e, f]
}

0

একটি সাধারণ তালিকার মতো শোনাচ্ছে যেখানে অ্যাড পদ্ধতিতে একটি অতিরিক্ত স্নিপেট থাকে যা যদি খুব দীর্ঘ হয়ে যায় তবে তালিকাটি কেটে যায়।

যদি এটি খুব সহজ হয় তবে আপনার সমস্যার বিবরণ সম্ভবত সম্পাদনা করতে হবে।


প্রকৃতপক্ষে, তাকে প্রথম উপাদানটি (অর্থাৎ প্রথম দিকের) মুছতে হবে, ছাঁটাই শেষ উপাদানটিকে মুছে ফেলবে। লিংকডলিস্টের সাথে এখনও ব্যবহারিক।
এমএকে


0

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

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


0

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


0

আমি মনে করি সেরা মিলের উত্তরটি এই অন্যান্য প্রশ্ন থেকে

অ্যাপাচি কমন্স সংগ্রহ 4 এর একটি সার্কুলারফাইকিউ রয়েছে যা আপনি যা খুঁজছেন তা। জাভাডোকের উদ্ধৃতি:

সার্কুলারফাইফিউ কিউ একটি স্থির আকারের সাথে প্রথম-ইন প্রথম-আউট সারি যা পূর্ণ হলে তার প্রাচীনতম উপাদানটি প্রতিস্থাপন করে।


0

একটি সহজ সমাধান নীচে "স্ট্রিং" এর একটি সারি দেওয়া আছে

LinkedHashMap<Integer, String> queue;
int queueKeysCounter;

queue.put(queueKeysCounter++, "My String");
queueKeysCounter %= QUEUE_SIZE;

নোট করুন যে এটি কাতারে থাকা আইটেমগুলির ক্রম বজায় রাখবে না, তবে এটি পুরানো এন্ট্রি প্রতিস্থাপন করবে।


0

যেমন এটি ওওপিগুলিতে পরামর্শ দেওয়া হয়েছে যে উত্তরাধিকারের চেয়ে আমাদের রচনাটি পছন্দ করা উচিত

এখানে আমার সমাধান যে বিষয়টি মাথায় রেখে।

package com.choiceview;

import java.util.ArrayDeque;

class Ideone {
    public static void main(String[] args) {
        LimitedArrayDeque<Integer> q = new LimitedArrayDeque<>(3);
        q.add(1);
        q.add(2);
        q.add(3);
        System.out.println(q);

        q.add(4);
        // First entry ie 1 got pushed out
        System.out.println(q);
    }
}

class LimitedArrayDeque<T> {

    private int maxSize;
    private ArrayDeque<T> queue;

    private LimitedArrayDeque() {

    }

    public LimitedArrayDeque(int maxSize) {
        this.maxSize = maxSize;
        queue = new ArrayDeque<T>(maxSize);
    }

    public void add(T t) {
        if (queue.size() == maxSize) {
            queue.removeFirst();
        }
        queue.add(t);
    }

    public boolean remove(T t) {
        return queue.remove(t);
    }

    public boolean contains(T t) {
        return queue.contains(t);
    }

    @Override
    public String toString() {
        return queue.toString();
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.