জাভা ব্যবহার করে আদিমদের একটি অ্যারে সর্বাধিক / মিনিটের মান সন্ধান করা


185

অ্যারেতে ন্যূনতম / সর্বাধিক মান নির্ধারণ করতে কোনও ফাংশন লিখতে এটি তুচ্ছ, যেমন:

/**
 * 
 * @param chars
 * @return the max value in the array of chars
 */
private static int maxValue(char[] chars) {
    int max = chars[0];
    for (int ktr = 0; ktr < chars.length; ktr++) {
        if (chars[ktr] > max) {
            max = chars[ktr];
        }
    }
    return max;
}

কিন্তু এটি ইতিমধ্যে কোথাও করা হয়নি?


8
ধারকগুলির অ্যারে থেকে আদিম অ্যারে সহায়তা করবে: স্ট্যাকওভারফ্লোCollections.max(Arrays.asList()) . com / প্রশ্নস / 703770০২৯৯/… এরপরে ।
সিরো সান্তিলি :3 冠状 病 六四 事件

আমি কেবল জাভাটি কতটা বোবা
ফরিদ

উত্তর:


173

কমন্স ল্যাং (রূপান্তর করতে) + সংগ্রহ (কমপক্ষে / সর্বনিম্ন) ব্যবহার করা হচ্ছে

import java.util.Arrays;
import java.util.Collections;

import org.apache.commons.lang.ArrayUtils;

public class MinMaxValue {

    public static void main(String[] args) {
        char[] a = {'3', '5', '1', '4', '2'};

        List b = Arrays.asList(ArrayUtils.toObject(a));

        System.out.println(Collections.min(b));
        System.out.println(Collections.max(b));
   }
}

নোট করুন যে Arrays.asList()অন্তর্নিহিত অ্যারেটি মোড়ানো, সুতরাং এটি খুব বেশি স্মৃতিযুক্ত হওয়া উচিত নয় এবং এটি অ্যারের উপাদানগুলিতে কোনও অনুলিপি সম্পাদন করা উচিত নয়।



4
Arrays.asList()ভাল থাকতে হবে, তবে ArrayUtils.toObject()প্রতিটি উপাদানকে aএকটি নতুন অ্যারেতে অনুলিপি করবে Character
ইএম

5
Arrays.asList(a)কাজ করে না আপনি আদিমদের একটি তালিকা তৈরি করতে পারবেন না ( List<char>এই ক্ষেত্রে)। প্রথমে আপনাকে আদিম মানগুলিকে বস্তুতে রূপান্তর করতে হবে এবং এজন্য ArrayUtils.toObjectব্যবহার করা হয়।
nessa.gp

94

আপনি কেবল নতুন জাভা 8 Streamটি ব্যবহার করতে পারেন তবে আপনাকে কাজ করতে হবে int

streamউপযোগ ক্লাসের পদ্ধতি Arraysআপনি একটি দেয় IntStreamযা আপনি ব্যবহার করতে পারেন minপদ্ধতি। এছাড়াও আপনি কি করতে পারেন max, sum, average, ...

getAsIntপদ্ধতি থেকে মান পেতে ব্যবহার করা হয়OptionalInt

import java.util.Arrays;

public class Test {
    public static void main(String[] args){
        int[] tab = {12, 1, 21, 8};
        int min = Arrays.stream(tab).min().getAsInt();
        int max = Arrays.stream(tab).max().getAsInt();
        System.out.println("Min = " + min);
        System.out.println("Max = " + max)
    }

}

== আপডেট ==

যদি এক্সিকিউশন সময়টি গুরুত্বপূর্ণ হয় এবং আপনি একবার summaryStatistics()এই জাতীয় পদ্ধতি ব্যবহার করতে পারেন তবে একবার আপনি ডেটা দিয়ে যেতে চান

import java.util.Arrays;
import java.util.IntSummaryStatistics;

public class SOTest {
    public static void main(String[] args){
        int[] tab = {12, 1, 21, 8};
        IntSummaryStatistics stat = Arrays.stream(tab).summaryStatistics();
        int min = stat.getMin();
        int max = stat.getMax();
        System.out.println("Min = " + min);
        System.out.println("Max = " + max);
    }
}

এই পদ্ধতিটি ক্লাসিকাল লুপের চেয়ে আরও ভাল পারফরম্যান্স দিতে পারে কারণ summaryStatisticsপদ্ধতিটি হ্রাস অপারেশন এবং এটি সমান্তরালকরণের অনুমতি দেয়।


57

গুগল পেয়ারা গ্রন্থাগার তার চর, ints, Longs হয়তো, ইত্যাদি ক্লাসের সর্বনিম্ন ও সর্বোচ্চ মেথড।

সুতরাং আপনি সহজভাবে ব্যবহার করতে পারেন:

Chars.min(myarray)

কোনও রূপান্তর প্রয়োজন হয় না এবং সম্ভবত এটি দক্ষতার সাথে প্রয়োগ করা হয়।


4
এটি প্রশ্নের মধ্যে কমবেশি প্রয়োগ করা হয়েছে, এটি দৈর্ঘ্যের অ্যারে 0 এর জন্য একটি অবৈধআর্গুমেন্ট এক্সেকশনটি ছুঁড়ে ফেলেছে। (কোড. google.com/p/guava-libraries/source/browse/trunk/src/com/… )
কলিনড

3
এটি এখানে সবকিছুর সেরা সমাধান। Java.util.Arrays # asList varargs কনফিউশনটি এড়িয়ে চলে।
কং

20

হ্যাঁ, এটি সংগ্রহের ক্লাসে হয়েছে। মনে রাখবেন যে আপনাকে আপনার আদিম চর অ্যারেটিকে ম্যানুয়ালি একটি চরিত্র [] এ রূপান্তর করতে হবে।

একটি সংক্ষিপ্ত ডেমো:

import java.util.*;

public class Main {

    public static Character[] convert(char[] chars) {
        Character[] copy = new Character[chars.length];
        for(int i = 0; i < copy.length; i++) {
            copy[i] = Character.valueOf(chars[i]);
        }
        return copy;
    }

    public static void main(String[] args) {
        char[] a = {'3', '5', '1', '4', '2'};
        Character[] b = convert(a);
        System.out.println(Collections.max(Arrays.asList(b)));
    }
}

1
Collections.min (myCollection); আপনি যদি এটি অ্যারের জন্য ব্যবহার করতে চান তবে আপনি এটি সংগ্রহে.মিন (অ্যারেএস.এললিস্ট (মাইআরাই)) এর মতো করতে পারেন;
জেড

3
একটি রূপান্তর char []একটি থেকে Character []সর্বোচ্চ নির্ণয় করার জন্য শুধুমাত্র বেশ অদক্ষ হয় - ভাল অনুরূপ প্রতিটি আদিম টাইপ জন্য স্ট্যাটিক পদ্ধতি একটি ইউটিলিটি বর্গ তৈরি java.util.Arrays: java.sun.com/javase/6/docs/api/java/util/Arrays.html
ক্রিস্টোফ

@ ক্রিসটফ: হ্যাঁ, অ্যারের আকার যদি বড় হয় তবে আমি সম্মত হব। কেবল এটিকে "অদক্ষ" বলে উল্লেখ করা যদি কোনও প্রশ্নযুক্ত অ্যাপ্লিকেশনটি অনেক ডাটাবেস কল এবং / অথবা আই / ও অপারেশন করে এবং অ্যারের আকার (আপেক্ষিক) ছোট হয় তবে তা বোঝা যায় না।
বার্ট কায়ার্স

পারফরম্যান্স কারণে আপনার Character.valueOf(chars[i])পরিবর্তে ব্যবহার করা উচিত new Character(chars[i]): java.sun.com/javase/6/docs/api/java/lang/…
ক্রিস্টোফ

@ ক্রিসটফ ক্রিস্টোফ ঠিক বলেছেন, সর্বনিম্ন সন্ধানের জন্য কোনও সংগ্রহকে একটি অ্যারে রূপান্তর করা অদক্ষ এবং বোকা।
অ্যালেক্সওয়েন

16
import java.util.Arrays;

public class apples {

  public static void main(String[] args) {
    int a[] = {2,5,3,7,8};
    Arrays.sort(a);

     int min =a[0];
    System.out.println(min);
    int max= a[a.length-1];
    System.out.println(max);

  }

}

4
দয়া করে কিছু ব্যাখ্যা দিন।
মাইক স্টকডেল

3
আমি মনে করি এর অর্থ যা বোঝায় তা হ'ল আপনি যদি অ্যারেটি বাছাই করেন (আরোহী ক্রমে), সংজ্ঞা অনুসারে, সর্বনিম্ন মান সর্বদা প্রথম অবস্থানে থাকবে, একটি [0], এবং সর্বোচ্চ মান সর্বদা সর্বশেষ অবস্থানে থাকবে , [a.leight-1]।
জেফ

1
সমস্যাটি সমাধানের এটি একটি বৈধ এবং কার্যকর উপায়। অন্যান্যগুলির তুলনায় এটি ব্যবহারে অসুবিধা কী?
অ্যালেক্স

8
@ অ্যালেক্স সময় জটিলতা - বাছাই সেরা একটি ও (nlogn) সম্পর্কিত বিষয়, অন্যদিকে মাইকেল রাদারফার্ডের দৃষ্টিভঙ্গি হ'ল (এন)।
জাজাদু

3
আমাদের তালিকা বাছাইয়ের প্রয়োজন নেই কারণ একক পুনরাবৃত্তির তালিকাতে ন্যূনতম এবং সর্বাধিক সন্ধান করা যথেষ্ট।
akhil_mittal

11

আমার সমস্ত অ্যাপ্লিকেশনগুলিতে এই জাতীয় পদ্ধতিগুলির সাথে আমার একটু সহায়ক ক্লাস রয়েছে:

public static double arrayMax(double[] arr) {
    double max = Double.NEGATIVE_INFINITY;

    for(double cur: arr)
        max = Math.max(max, cur);

    return max;
}

1
আপনার দ্বিগুণ সর্বোচ্চ = ডাবল ব্যবহার করা উচিত N NEGATIVE_INFINITY; ডাবল সর্বাধিকের পরিবর্তে = ডাবল M MIN_VALUE; দ্বিগুণের জন্য যেমন MIN_VALUE ইতিবাচক
ক্রিম

1
... অথবা আপনি অ্যারেতে প্রথম আইটেমটিতে সর্বোচ্চ সেট করতে পারেন এবং ২ য় আইটেম থেকে পুনরাবৃত্তি করতে পারেন, আমার উত্তর দেখুন।
নিকোলাস হ্যামিল্টন

3

আপনি এটি সহজেই একটি IntStreamএবং max()পদ্ধতি দিয়ে করতে পারেন ।

উদাহরণ

public static int maxValue(final int[] intArray) {
  return IntStream.range(0, intArray.length).map(i -> intArray[i]).max().getAsInt();
}

ব্যাখ্যা

  1. range(0, intArray.length)- উপস্থিত হিসাবে অনেক উপাদান সহ একটি স্ট্রিম পেতে intArray

  2. map(i -> intArray[i])- স্ট্রিমের প্রতিটি উপাদানকে একটি আসল উপাদানটিতে মানচিত্র করুন intArray

  3. max()- এই স্ট্রিমের সর্বাধিক উপাদান পান OptionalInt

  4. getAsInt()- খুলে ফেলুন OptionalInt। (আপনি এখানেও ব্যবহার করতে পারেন: orElse(0)কেবল OptionalIntখালি খালি থাকলে))



2
import java.util.Random;

public class Main {

public static void main(String[] args) {
   int a[] = new int [100];
   Random rnd = new Random ();

    for (int i = 0; i< a.length; i++) {
        a[i] = rnd.nextInt(99-0)+0;
        System.out.println(a[i]);
    }

    int max = 0;          

    for (int i = 0; i < a.length; i++) {
        a[i] = max;


        for (int j = i+1; j<a.length; j++) {
            if (a[j] > max) {
               max = a[j];
            }

        }
    }

    System.out.println("Max element: " + max);
}
}

2
    public int getMin(int[] values){
        int ret = values[0];
        for(int i = 1; i < values.length; i++)
            ret = Math.min(ret,values[i]);
        return ret;
    }

এটি সংখ্যার জন্য intতবে প্রশ্নটি আদিম মানগুলির জন্য জিজ্ঞাসা করছেint, long, char, byte....
IgniteCoders

2

এর সাথে একটি সমাধান reduce():

int[] array = {23, 3, 56, 97, 42};
// directly print out
Arrays.stream(array).reduce((x, y) -> x > y ? x : y).ifPresent(System.out::println);

// get the result as an int
int res = Arrays.stream(array).reduce((x, y) -> x > y ? x : y).getAsInt();
System.out.println(res);
>>
97
97

উপরের কোডে, ফর্ম্যাটে reduce()ডেটা ফেরত দেয় Optionalযা আপনি intদ্বারা রূপান্তর করতে পারেন getAsInt()

আমরা যদি একটি নির্দিষ্ট সংখ্যার সাথে সর্বাধিক মানটি তুলনা করতে চাই, তবে আমরা এখানে একটি সূচনা মান সেট করতে পারি reduce():

int[] array = {23, 3, 56, 97, 42};
// e.g., compare with 100
int max = Arrays.stream(array).reduce(100, (x, y) -> x > y ? x : y);
System.out.println(max);
>>
100

উপরের কোডে, যখন reduce()প্রথম পরামিতি হিসাবে একটি পরিচয় (শুরুর মান) হয়, তখন এটি পরিচয় সহ একই ফর্ম্যাটে ডেটা ফেরত দেয়। এই সম্পত্তি সহ, আমরা অন্যান্য অ্যারেতে এই সমাধানটি প্রয়োগ করতে পারি:

double[] array = {23.1, 3, 56.6, 97, 42};
double max = Arrays.stream(array).reduce(array[0], (x, y) -> x > y ? x : y);
System.out.println(max);
>>
97.0

1

ভাসা সহ উদাহরণ:

public static float getMaxFloat(float[] data) {

    float[] copy = Arrays.copyOf(data, data.length);
    Arrays.sort(copy);
    return copy[data.length - 1];
}

public static float getMinFloat(float[] data) {

    float[] copy = Arrays.copyOf(data, data.length);
    Arrays.sort(copy);
    return copy[0];
}

যদিও আপনার সমাধানটি কাজ করবে, তবে এটি ও (nlogn) সময়ের জটিলতা বাড়িয়ে তুলবে যখন অন্য উত্তরগুলি ব্যবহার করে কমপক্ষে ও (এন) এ সহজেই পাওয়া যাবে।
প্রমোদ

এই পরিস্থিতিতে একটি বাছাই করতে সহজ পাগল।
নিকোলাস হ্যামিল্টন

এটি কার্যকর হতে পারে যখন প্রথম মেরামত সহ প্রথম এন> 1 টি ছোট / বৃহত্তম মান প্রয়োজন হয়।
বিজিক্লপ

1

প্রায় 99% রানের সর্বোচ্চ মান পাওয়ার একটি সমাধান এখানে দেওয়া হয়েছে (আরও ভাল ফলাফল পেতে 0.01 পরিবর্তন করুন):

public static double getMax(double[] vals){
    final double[] max = {Double.NEGATIVE_INFINITY};

    IntStream.of(new Random().ints((int) Math.ceil(Math.log(0.01) / Math.log(1.0 - (1.0/vals.length))),0,vals.length).toArray())
            .forEach(r -> max[0] = (max[0] < vals[r])? vals[r]: max[0]);

    return max[0];
}

(সম্পূর্ণ গুরুতর নয়)


;-) এটি "সম্পূর্ণ গুরুতর নয়" ঠিক আছে। উর্ধ্বে দেওয়াতে বিরক্তি প্রকাশ করা হচ্ছে…
ওলে ভিভি

0

একটি পদ্ধতি অ্যারের পাস যে প্রকারের এটা দিয়ে Arrays.sort()তাই এটি শুধুমাত্র অ্যারের পদ্ধতি ব্যবহার করছে বাছাই করে তারপর সেট করে সর্বনিম্ন করতে array[0]এবং সর্বোচ্চ থেকে array[array.length-1]


3
সম্ভবত এটি লক্ষণীয় যে ক) এটি অ্যারে সংশোধন করে এবং খ) বড় অ্যারেগুলির জন্য এটি ও (এন) এর চেয়ে আরও ব্যয়বহুল সমাধান ও (এনলগ এন)
ডেভিডশেল্ডন

0

একটি অ্যারের সর্বনিম্ন / সর্বোচ্চ মান পাওয়ার প্রাথমিক উপায়। যদি আপনার অরসোর্টড অ্যারে প্রয়োজন হয় তবে আপনি একটি অনুলিপি তৈরি করতে পারেন বা কোনও পদ্ধতিতে এটি ন্যূনতম বা সর্বোচ্চ প্রদান করতে পারেন। যদি তা না হয় তবে সাজানো অ্যারে আরও ভাল কারণ এটি কিছু ক্ষেত্রে দ্রুত সম্পাদন করে।

public class MinMaxValueOfArray {
    public static void main(String[] args) {
        int[] A = {2, 4, 3, 5, 5};
        Arrays.sort(A);
        int min = A[0];
        int max = A[A.length -1];
        System.out.println("Min Value = " + min);        
        System.out.println("Max Value = " + max);
    }
}

2
বাছাইয়ের সমস্যাটি হ'ল এটি ও (এন) সমস্যার জন্য একটি ও (এন লগ এন) ওভারহেড রয়েছে। তবে ইতিমধ্যে প্রদত্ত অন্য তিনটি "অ্যারে বাছাই করুন" এর চেয়ে এটি ভাল।
তেপিম্ম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.