কীভাবে সংগ্রহ থেকে সর্বোচ্চ মান পাবেন (উদাহরণস্বরূপ অ্যারেলিস্ট)?


134

একটি অ্যারেলিস্ট রয়েছে যা পূর্ণসংখ্যার মানগুলি সঞ্চয় করে। এই তালিকায় আমার সর্বাধিক মান খুঁজে পাওয়া দরকার। যেমন ধরুন অ্যারেলিস্টের সঞ্চিত মানগুলি: 10, 20, 30, 40, 50এবং সর্বাধিক মান হবে 50

সর্বাধিক মান সন্ধান করার দক্ষ উপায় কী?

@ সম্পাদনা: আমি সবেমাত্র একটি সমাধান পেয়েছি যার জন্য আমি খুব নিশ্চিত নই

ArrayList<Integer> arrayList = new ArrayList<Integer>();
arrayList.add(100); /* add(200), add(250) add(350) add(150) add(450)*/

Integer i = Collections.max(arrayList)

এবং এটি সর্বাধিক মান প্রদান করে।

প্রতিটি মান যেমন তুলনা করার অন্য উপায় selection sort or binary sort algorithm  


2
আপনি কি মূল্য খুঁজে পেতে চেষ্টা করেছেন? কোথায় আটকে গেলেন? আপনার নিজস্ব সমাধান সম্ভবত খুব অকার্যকর?
অ্যান্টনি পেগ্রাম

1
যদি আপনি এমন কিছু করেন যা জাভা এটি সমাবেশে সংকলন করবে তাই আপনি নিরীহ কিছু না করলে আপনার কোডটি কেবল একটি সাধারণ পুনরাবৃত্তিকারী দ্বারা যথেষ্ট দক্ষ হবে।
বিল কে

@ অ্যান্থনি পেগ্রাম: মানে কোনটি সাজানো অ্যালগরিদম বা জাভাতে কোনও পদ্ধতি আছে? বিটিডাব্লু গুতোম্যানদের উত্তর পরীক্ষা করে দেখুন।
ব্যবহারকারী 1010399

একটি অ্যারের যে থাকতে পারে জন্য null: মান stackoverflow.com/questions/369383/...
সিরো Santilli郝海东冠状病六四事件法轮功

উত্তর:


292

আপনি Collections APIযা সহজেই যা চান তা অর্জন করতে আপনি ব্যবহার করতে পারেন - দক্ষতার সাথে পড়ুন - কালেকশন.ম্যাক্সের জন্য পর্যাপ্ত জাভাদোক

Collections.max(arrayList);

প্রদত্ত সংগ্রহের সর্বাধিক উপাদানটি এর উপাদানগুলির প্রাকৃতিক ক্রম অনুসারে প্রদান করে। সংগ্রহের সমস্ত উপাদানকে তুলনামূলক ইন্টারফেস প্রয়োগ করতে হবে।


8
কেন এটি গৃহীত উত্তর? এটা না সবচেয়ে বেশি কার্যকরী সমাধান। সর্বোত্তম কেস, এটি ও (এন লগ (এন)) এবং এগুলি পরীক্ষা করে সর্বোচ্চটি বেছে নেওয়া কেবল ও (এন)
ব্রেন্ডন লং

হ্যাঁ, তালিকার মধ্য দিয়ে পুনরাবৃত্তি হ'ল O(n log(n))তবে "যদি কোনও বিশেষভাবে কার্যকর উপায় না থাকে", আপনি সমস্ত কিছুর পাশাপাশি এটির আরও ভাল সমাধান কী প্রস্তাব করেন?
getomanners

প্রথমে উপাদান বাছাই করা এবং সর্বোচ্চ ব্যবহারের চেয়ে নির্লজ্জভাবে পুনরাবৃত্তি দ্রুততর (চেক করা হয়েছে, তুলনাকারী একটি মানচিত্র থেকে স্কোর আনছে) is উভয় বাছাই + প্রথমে নেওয়া এবং সর্বোচ্চ একটি ল্যাম্বডা ব্যবহার করা হয় used
majTheHero

31

এই প্রশ্নটি প্রায় এক বছরের পুরনো তবে আমি খুঁজে পেয়েছি যে আপনি যদি বস্তুর জন্য একটি কাস্টম তুলনা করেন তবে আপনি অবজেক্টের অ্যারে তালিকার জন্য কালেকশন.ম্যাক্স ব্যবহার করতে পারেন।

import java.util.Comparator;

public class compPopulation implements Comparator<Country> {
    public int compare(Country a, Country b) {
        if (a.getPopulation() > b.getPopulation())
            return -1; // highest value first
        if (a.getPopulation() == b.Population())
            return 0;
        return 1;
    }
}
ArrayList<Country> X = new ArrayList<Country>();
// create some country objects and put in the list
Country ZZ = Collections.max(X, new compPopulation());

আপনার কি ক্যালেন্ডার ধরণের জন্য একটি কাস্টম তুলক প্রয়োজন?
tatmanblue

আপনার কোড তালিকার সবচেয়ে ছোট মানটি ফেরত দেয়, যদি (a.getPopulation ()> b.getPopulation ()) -1; উপরেরগুলিতে পরিবর্তিত হতে হবে, (a.getPopulation () <b.getPopulation ()) -1; // সর্বোচ্চ মান প্রথম
চন্দ্রকণ্ঠ গৌড়

এটি ল্যাম্বডা ব্যবহার করেও করা যেতে পারে: ম্যাক্সেলিমেন্ট = কালেকশন.ম্যাক্স (সংগ্রহ, (এল 1, এল 2) -> এল 1 - এল 2);
majTheHero

22
public int getMax(ArrayList list){
    int max = Integer.MIN_VALUE;
    for(int i=0; i<list.size(); i++){
        if(list.get(i) > max){
            max = list.get(i);
        }
    }
    return max;
}

আমার বোধগম্যতা থেকে, সংগ্রহগুলি.ম্যাক্স () মূলত এটি করে, যদিও তালিকাগুলি জেনারিক হওয়ায় তারা তুলনামূলক ব্যবহার করে।


এটি আমার ক্ষেত্রে অন্য যে কোনও কিছুর চেয়ে দ্রুত।
majTheHero

14

আমরা সহজভাবে ব্যবহার Collections.max()এবং Collections.min()পদ্ধতি করতে পারি ।

public class MaxList {
    public static void main(String[] args) {
        List l = new ArrayList();
        l.add(1);
        l.add(2);
        l.add(3);
        l.add(4);
        l.add(5);
        System.out.println(Collections.max(l)); // 5
        System.out.println(Collections.min(l)); // 1
    }
}

8

পূর্ণাঙ্গ শ্রেণি তুলনামূলক প্রয়োগ করে ments সুতরাং আমরা সহজেই পূর্ণসংখ্যার তালিকার সর্বাধিক বা ন্যূনতম মান পেতে পারি।

public int maxOfNumList() {
    List<Integer> numList = new ArrayList<>();
    numList.add(1);
    numList.add(10);
    return Collections.max(numList);
}

যদি কোনও শ্রেণি তুলনামূলক প্রয়োগ করে না এবং আমাদের সর্বাধিক এবং ন্যূনতম মানটি খুঁজে পেতে হয় তবে আমাদের নিজস্ব তুলনামূলক লিখতে হবে।

List<MyObject> objList = new ArrayList<MyObject>();
objList.add(object1);
objList.add(object2);
objList.add(object3);
MyObject maxObject = Collections.max(objList, new Comparator<MyObject>() {
    @Override
    public int compare(MyObject o1, MyObject o2) {
        if (o1.getValue() == o2.getValue()) {
            return 0;
        } else if (o1.getValue() > o2.getValue()) {
            return -1;
        } else if (o1.getValue() < o2.getValue()) {
            return 1;
        }
        return 0;
    }
});

7

Comparator.comparing

জাভা 8-এ, ল্যাম্বডা ব্যবহার করে সংগ্রহগুলি বাড়ানো হয়েছে। সুতরাং সর্বাধিক এবং নূন্যতম সন্ধান করা নিম্নলিখিত ব্যবহার করে সম্পন্ন করা যেতে পারে Comparator.comparing:

কোড:

List<Integer> ints = Stream.of(12, 72, 54, 83, 51).collect(Collectors.toList());
System.out.println("the list: ");
ints.forEach((i) -> {
    System.out.print(i + " ");
});
System.out.println("");
Integer minNumber = ints.stream()
        .min(Comparator.comparing(i -> i)).get();
Integer maxNumber = ints.stream()
        .max(Comparator.comparing(i -> i)).get();

System.out.println("Min number is " + minNumber);
System.out.println("Max number is " + maxNumber);

আউটপুট:

 the list: 12 72 54 83 51  
 Min number is 12 
 Max number is 83

5

অরসোর্টড তালিকার সর্বোচ্চ মান সন্ধানের জন্য কোনও বিশেষ উপায় নেই - আপনাকে কেবলমাত্র সেগুলি পরীক্ষা করে সর্বোচ্চ মানটি ফিরিয়ে আনতে হবে।


এই পূর্ণসংখ্যা সম্পর্কে কি i = Collections.max(arrayList)। আমি খুব নিশ্চিত না কিনা তা আমার ক্ষেত্রে সর্বোচ্চ মান দেয় very তুমি কী বল?
ব্যবহারকারী 1010399

@ ব্যবহারকারী 1010399 - আমি যা বলছি ঠিক এটি করে - এটি প্রতিটি মান পরীক্ষা করে এবং সর্বোচ্চটি দেয় returns
ব্রেন্ডন লং

ঠিক আছে. ধন্যবাদ। আমি এই সংগ্রহ পদ্ধতি এবং বাছাইকরণ অ্যালগরিদমের মধ্যে কিছুটা বিভ্রান্ত হয়ে পড়েছিলাম।
ব্যবহারকারী 1010399

4

স্ট্রিম ব্যবহার করে তালিকার সর্বোচ্চ মান সন্ধানের আরও তিনটি উপায় এখানে রয়েছে:

List<Integer> nums = Arrays.asList(-1, 2, 1, 7, 3);
Optional<Integer> max1 = nums.stream().reduce(Integer::max);
Optional<Integer> max2 = nums.stream().max(Comparator.naturalOrder());
OptionalInt max3 = nums.stream().mapToInt(p->p).max();
System.out.println("max1: " + max1.get() + ", max2: " 
   + max2.get() + ", max3: " + max3.getAsInt());

এই সমস্ত পদ্ধতি যেমন ঠিক Collections.maxপুরো সংগ্রহটি নিয়ে পুনরাবৃত্তি করে, সুতরাং তাদের সংগ্রহের আকারের সাথে আনুপাতিক সময়ের প্রয়োজন।


3

জাভা 8

পূর্ণসংখ্যার তুলনামূলক হিসাবে আমরা নিম্নলিখিত একটি লাইনার ব্যবহার করতে পারি:

List<Integer> ints = Stream.of(22,44,11,66,33,55).collect(Collectors.toList());
Integer max = ints.stream().mapToInt(i->i).max().orElseThrow(NoSuchElementException::new); //66
Integer min = ints.stream().mapToInt(i->i).min().orElseThrow(NoSuchElementException::new); //11

অন্য বিন্দু উল্লেখ্য আমরা ব্যবহার করতে পারবেন না Funtion.identity()স্থানে i->iযেমন mapToIntআশা ToIntFunctionযা একটি সম্পূর্ণ ভিন্ন ইন্টারফেস এবং এর সাথে সম্পর্কিত নয় Function। তদুপরি এই ইন্টারফেসের একটি মাত্র পদ্ধতি applyAsIntএবং কোনও identity()পদ্ধতি নেই।


1

এখানে fucntion

public int getIndexOfMax(ArrayList<Integer> arr){
    int MaxVal = arr.get(0); // take first as MaxVal
    int indexOfMax = -1; //returns -1 if all elements are equal
    for (int i = 0; i < arr.size(); i++) {
        //if current is less then MaxVal
        if(arr.get(i) < MaxVal ){
            MaxVal = arr.get(i); // put it in MaxVal
            indexOfMax = i; // put index of current Max
        }
    }
    return indexOfMax;  
}

1
package in.co.largestinarraylist;

import java.util.ArrayList;
import java.util.Scanner;

public class LargestInArrayList {

    public static void main(String[] args) {

        int n;
        ArrayList<Integer> L = new ArrayList<Integer>();
        int max;
        Scanner in = new Scanner(System.in);
        System.out.println("Enter Size of Array List");
        n = in.nextInt();
        System.out.println("Enter elements in Array List");

        for (int i = 0; i < n; i++) {
            L.add(in.nextInt());
        }

        max = L.get(0);

        for (int i = 0; i < L.size(); i++) {
            if (L.get(i) > max) {
                max = L.get(i);
            }
        }

        System.out.println("Max Element: " + max);
        in.close();
    }
}




-3

আপনার অ্যারের আকারের উপর নির্ভর করে একটি বহুবিবাহিত সমাধানও জিনিসগুলিকে গতি বাড়িয়ে দিতে পারে


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