জাভা অ্যারেলিস্ট শুরুতে কীভাবে উপাদান যুক্ত করা যায় ist


183

আমার যে কোনও ArrayListসারিতে উপাদান যুক্ত করা দরকার , তবে যখন আমি কোনও উপাদান যুক্ত করার জন্য ফাংশনটি কল করি তখন আমি এটিটি অ্যারের শুরুতে উপাদানটি যুক্ত করতে চাই (সুতরাং এটিতে সর্বনিম্ন সূচী থাকে) এবং অ্যারেতে যদি 10 টি উপাদান যুক্ত হয় তবে প্রাচীনতম উপাদানটি মুছতে নতুন ফলাফল (সর্বোচ্চ সূচকযুক্ত একটি) results

যে কেউ কোন পরামর্শ আছে?


আপনি কি মানে removeএবং মত add?
পিটার ল্যারি

arraylist stack queue whateverঅ্যারের শুরুতে আপনি কী ব্যবহার করছেন তা এড়ানো সবচেয়ে ভাল এবং এটিকে আপনার আলাদা সংগ্রহ ব্যবহার করা উচিত বলে মনে হচ্ছে।
পিটার লরি

প্রথমত, আপনার নিজের কিছু তৈরি করা উচিত। আপনি এ পর্যন্ত কি করেছে?
ইয়েগোশিন ম্যাক্সিম

উত্তর:


301

Listপদ্ধতি আছে add(int, E), যাতে আপনি ব্যবহার করতে পারেন:

list.add(0, yourObject);

এরপরে আপনি এর মাধ্যমে শেষ উপাদানটি মুছতে পারেন:

if(list.size() > 10)
    list.remove(list.size() - 1);

তবে আপনি নিজের প্রয়োজনীয়তাগুলি নিয়ে পুনর্বিবেচনা করতে পারেন বা একটি ভিন্ন ডেটা কাঠামো ব্যবহার করতে পারেন Queue

সম্পাদনা

অ্যাপাচি এর দিকে একবার নজর দিন CircularFifoQueue:

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

আপনার সাথে এটি সর্বাধিক আকারের সাথে সূচনা করুন:

CircularFifoQueue queue = new CircularFifoQueue(10);

10
দশ ফুট খুঁটির সাথে আমি কোনও অ্যাপাচি লাইব্রেরি স্পর্শ করব না, বিশেষত যেহেতু পেয়ারার সংগ্রহের ক্লাস রয়েছে। পেয়ারা এর EvictingQueue এখানে ভাল পছন্দ হতে পারে।
ডিপিএম

26

নির্দিষ্ট ডেটাস্ট্রাকচার ব্যবহার করে

এখানে বিভিন্ন ডেটা স্ট্রাকচার রয়েছে যা প্রথম সূচকে উপাদান যুক্ত করার জন্য অনুকূলিত হয়েছে। তবে মনে রাখবেন যে আপনি যদি নিজের সংগ্রহটিকে এর মধ্যে একটিতে রূপান্তর করেন তবে কথোপকথনের সম্ভবত একটি সময় এবং স্পেস জটিলতার প্রয়োজন হবেO(n)

Deque

JDK রয়েছে Dequeগঠন যা অফার পদ্ধতি পছন্দ addFirst(e)এবংofferFirst(e)

Deque<String> deque = new LinkedList<>();
deque.add("two");
deque.add("one");
deque.addFirst("three");
//prints "three", "two", "one"

বিশ্লেষণ

সন্নিবেশের স্থান এবং সময়ের জটিলতা LinkedListধ্রুবক ( O(1)) সহ। দেখুন বিগ-হে cheatsheet

তালিকা বিপরীত

একটি খুব সহজ তবে অদক্ষ পদ্ধতি হ'ল বিপরীতটি ব্যবহার করা:

 Collections.reverse(list);
 list.add(elementForTop);
 Collections.reverse(list);

আপনি যদি জাভা 8 টি স্ট্রিম ব্যবহার করেন তবে এই উত্তরটি আপনার আগ্রহী হতে পারে।

বিশ্লেষণ

  • সময় জটিলতা: O(n)
  • স্পেস জটিলতা: O(1)

জেডিকে বাস্তবায়নের দিকে তাকানোতে এটি O(n)সময়ের জটিলতা তাই কেবলমাত্র খুব ছোট তালিকার জন্য উপযুক্ত।


দু'বার তালিকা উল্টাচ্ছে। এটি কি উপরোক্ত গৃহীত সমাধানের তুলনায় অ্যালগোরিদমের রান সময়কে বড় ব্যবধানে যুক্ত করবে?
সম্যক উপাধ্যায়

এটি 2 এন যোগ করেছে, তাই হ্যাঁ, তবে আপনার <50 টির তালিকা থাকলে আপনি বেশিরভাগ আধুনিক মেশিনের মধ্যে পার্থক্যটি মাইক্রো বেনমার্ক করতে সক্ষম হবেন না
প্যাট্রিক ফ্যাভ্রে

8

আপনি অ্যাডটি দেখতে পারেন (int সূচক, ই উপাদান) :

এই তালিকার নির্দিষ্ট অবস্থানে নির্দিষ্ট উপাদান সন্নিবেশ করান। উপাদানটি বর্তমানে সেই অবস্থানে (যদি থাকে) এবং পরবর্তী কোনও উপাদানকে ডানে স্থানান্তরিত করে (তাদের সূচকগুলিতে একটি যুক্ত করে)।

একবার যোগ করার পরে আপনি অ্যারেলিস্টের আকারটি পরীক্ষা করতে পারেন এবং শেষেগুলি মুছতে পারেন।


4

আপনি ডেকের দিকে চেয়ে থাকতে পারেন। এটি আপনাকে তালিকার প্রথম এবং শেষ দুটি আইটেমের সরাসরি অ্যাক্সেস দেয়।


1
আমি অবাক হলাম আপনি ডেকের বিষয়ে কথা বলার একমাত্র উত্তর, এটি সম্ভবত সর্বোত্তম সর্বোত্তম সমাধান।
গিলিয়াম এফ।

3

আপনি যা বর্ণনা করছেন, তা ব্যবহার করার উপযুক্ত পরিস্থিতি Queue

যেহেতু আপনি addনতুন উপাদান এবং পুরানোটি চান remove। আপনি শেষে যুক্ত করতে পারেন, এবং শুরু থেকে অপসারণ করতে পারেন। এটি খুব একটা পার্থক্য তৈরি করবে না।

সারিটির পদ্ধতি রয়েছে add(e)এবং remove()যা শেষে নতুন উপাদান যুক্ত করে এবং শুরু থেকে যথাক্রমে পুরাতন উপাদানটিকে সরিয়ে দেয়।

Queue<Integer> queue = new LinkedList<Integer>();
queue.add(5);
queue.add(6);
queue.remove();  // Remove 5

সুতরাং, আপনি যখনই কোনও উপাদান যুক্ত করবেন ততবার আপনি queueএটিকে কোনও removeমেথড কল দিয়ে ব্যাক আপ করতে পারেন ।


আপডেট : -

এবং যদি আপনি এর আকারটি স্থিরQueue করতে চান তবে আপনি একবার দেখে নিতে পারেন: -ApacheCommons#CircularFifoBuffer

এর থেকে documentation: -

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

Buffer queue = new CircularFifoBuffer(2); // Max size

queue.add(5);
queue.add(6);
queue.add(7);  // Automatically removes the first element `5`

আপনি দেখতে পাচ্ছেন, যখন সর্বোচ্চ আকার পৌঁছে যায়, তারপরে নতুন উপাদান যুক্ত করা স্বয়ংক্রিয়ভাবে প্রবেশ করা প্রথম উপাদানটিকে সরিয়ে দেয়।


1

আমি মনে করি বাস্তবায়নটি সহজ হওয়া উচিত, তবে দক্ষতার কথা বিবেচনা করে আপনার ধারক হিসাবে অ্যারেলিস্ট নয় বরং লিংকডলিস্ট ব্যবহার করা উচিত। আপনি নিম্নলিখিত কোড উল্লেখ করতে পারেন:

import java.util.LinkedList;
import java.util.List;

public class DataContainer {

    private List<Integer> list;

    int length = 10;
    public void addDataToArrayList(int data){
        list.add(0, data);
        if(list.size()>10){
            list.remove(length);
        }
    }

    public static void main(String[] args) {
        DataContainer comp = new DataContainer();
        comp.list = new LinkedList<Integer>();

        int cycleCount = 100000000;

        for(int i = 0; i < cycleCount; i ++){
            comp.addDataToArrayList(i);
        }
    }
}


0

আপনি এই কোড ব্যবহার করতে পারেন

private List myList = new ArrayList();
private void addItemToList(Object obj){
    if(myList.size()<10){
      myList.add(0,obj);
    }else{
      myList.add(0,obj);
      myList.remove(10);
    }
}

0

আপনি তালিকা পদ্ধতিগুলি ব্যবহার করতে পারেন, অপসারণ এবং যোগ করতে পারেন

list.add(lowestIndex, element);
list.remove(highestIndex, element);

0

এই উদাহরণটি ধরুন: -

List<String> element1 = new ArrayList<>();
element1.add("two");
element1.add("three");
List<String> element2 = new ArrayList<>();
element2.add("one");
element2.addAll(element1);

-1

তুমি ব্যবহার করতে পার

public List<E> addToListStart(List<E> list, E obj){
list.add(0,obj);
return (List<E>)list;

}

আপনার ডেটাটাইপ দিয়ে ই পরিবর্তন করুন

যদি প্রাচীনতম উপাদানটি মুছতে প্রয়োজনীয় হয় তবে আপনি যুক্ত করতে পারেন:

list.remove(list.size()-1); 

রিটার্ন স্টেটমেন্ট আগে। অন্যথায় তালিকা শুরুতে আপনার অবজেক্টকে যুক্ত করবে এবং প্রাচীনতম উপাদানটি ধরে রাখবে।

এটি তালিকার শেষ উপাদানটি মুছবে।


-1
import java.util.*:
public class Logic {
  List<String> list = new ArrayList<String>();
  public static void main(String...args) {
  Scanner input = new Scanner(System.in);
    Logic obj = new Logic();
      for (int i=0;i<=20;i++) {
        String string = input.nextLine();
        obj.myLogic(string);
        obj.printList();
      }
 }
 public void myLogic(String strObj) {
   if (this.list.size()>=10) {
      this.list.remove(this.list.size()-1);
   } else {
     list.add(strObj); 
   }
 }
 public void printList() {
 System.out.print(this.list);
 }
}

-2

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

 Method:

   updateArray (Element to insert)

     - for all the elements of the Array
       - start from the end and replace with the one on the left; 
     - Array [0] <- Element

শুভকামনা

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