संग्रह से अधिकतम मूल्य कैसे प्राप्त करें (उदाहरण के लिए ArrayList)?


134

एक ArrayList है जो पूर्णांक मानों को संग्रहीत करता है। मुझे इस सूची में अधिकतम मूल्य खोजने की आवश्यकता है। उदाहरण के लिए मान लें कि संग्रहित मान हैं: 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
यदि यह कुछ ऐसा है जो आप बहुत कुछ करते हैं तो जावा इसे असेंबली में संकलित करेगा, जब तक कि आप कुछ मूर्खतापूर्ण नहीं करते हैं, बस एक साधारण मध्यस्थ के साथ आपका कोड काफी कुशल होगा।
बिल के

@AnthonyPegram: मेरा मतलब है कि कौन सा एल्गोरिथ्म है या जावा में कोई विधि है? बीटीडब्ल्यू ने गेनोमर्स के जवाब की जांच की।
user1010399

किसी ऐसे सरणी के लिए जिसमें nullमान हो सकते हैं : stackoverflow.com/questions/369383/…
Ciro Santilli 病 contain contain contain

जवाबों:


292

आप Collections APIजो कुछ भी आसानी से प्राप्त करना चाहते हैं , उसे प्राप्त करने के लिए उपयोग कर सकते हैं - कुशलतापूर्वक पढ़ें - संग्रह के लिए पर्याप्त जावाडॉक

Collections.max(arrayList);

दिए गए संग्रह के अधिकतम तत्व को उसके तत्वों के प्राकृतिक क्रम के अनुसार लौटाता है। संग्रह के सभी तत्वों को तुलनात्मक इंटरफ़ेस को लागू करना चाहिए।


8
यह स्वीकृत उत्तर क्यों है? यह नहीं सबसे कुशल समाधान। सबसे अच्छा मामला, यह ओ (एन लॉग (एन)) है और उन सभी की जांच करके अधिकतम उठा रहा है केवल ओ (एन)
ब्रेंडन लॉन्ग

हां, सूची के माध्यम से पुनरावृत्ति होती है, O(n log(n))लेकिन अगर "कोई विशेष रूप से कुशल तरीका नहीं है", तो आप क्या प्रस्ताव करते हैं कि उन सभी की जांच करने के अलावा एक बेहतर समाधान है?
9

Naively पुनरावृत्ति तेजी से (जाँच की जाती है, तुलनित्र एक मानचित्र से स्कोर प्राप्त कर रहा था) या तो छँटाई और पहला तत्व प्राप्त करने या अधिकतम का उपयोग करने से। दोनों तरह + ले पहले और अधिकतम एक मेमने का इस्तेमाल किया।
मेजरहेरो

31

यह प्रश्न लगभग एक वर्ष पुराना है, लेकिन मैंने पाया है कि यदि आप वस्तुओं के लिए एक कस्टम तुलनित्र बनाते हैं तो आप वस्तुओं की एक सरणी सूची के लिए Collections.max का उपयोग कर सकते हैं।

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());

क्या आपको कैलेंडर प्रकारों के लिए एक कस्टम तुलनित्र की आवश्यकता है?
तातमानब्लू

आपका कोड सूची में सबसे छोटा मान लौटाता है, अगर (a.getPopulation ()> b.getPopulation ()) रिटर्न -1; उपरोक्त को बदलना होगा, अगर (a.getPopulation () <b.getPopulation ()) रिटर्न -1; // उच्चतम मूल्य पहले
चंद्रकांत गौड़ा

यह एक लैम्ब्डा का उपयोग करके भी किया जा सकता है: maxElement = Collections.max (संग्रह, (el1, el2) -> el1 - el2);
मेजरहेरो

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;
}

मेरी समझ से, यह मूल रूप से Collections.max () करता है, हालांकि वे एक तुलनित्र का उपयोग करते हैं क्योंकि सूचियां सामान्य हैं।


यह मेरे मामले के लिए किसी भी चीज से ज्यादा तेज है।
मेजरहेरो

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

पूर्णांक वर्ग तुलनात्मक लागू करता है। इसलिए हम आसानी से पूर्णांक सूची का अधिकतम या न्यूनतम मान प्राप्त कर सकते हैं।

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)। यह मेरे मामले में उच्चतम मूल्य लौटाता है कि क्या मुझे बहुत यकीन नहीं है। क्या आप कहते हैं?
user1010399

@ user1010399 - यह वही है जो मैं कह रहा हूं - यह हर मूल्य की जांच करता है और उच्चतम रिटर्न देता है।
ब्रेंडन लॉन्ग

ठीक है। धन्यवाद। मैं इस संग्रह विधि और छँटाई एल्गोरिथ्म के बीच थोड़ा उलझन में था।
user1010399

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();
    }
}

1

गोमेद के उत्तर के अलावा , यदि कोई अन्य व्यक्ति उसी समस्या के लिए एक निरापद समाधान की तलाश में यहां आया है, तो मैंने इसे समाप्त कर दिया है

Collections.max(arrayList, Comparator.nullsFirst(Comparator.naturalOrder()))



-3

आपके सरणी के आकार के आधार पर एक बहुस्तरीय समाधान भी चीजों को गति दे सकता है


यह प्रश्न के वास्तविक उत्तर की तुलना में अधिक लगता है।
Pac0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.