জাভা অ্যারে সাজানো সাজানো?


276

অ্যারে ক্লাসে আরোহী ক্রমানুসারে কীভাবে তাদের সাজানোর পদ্ধতি রয়েছে এমন উত্থিত ক্রমে কোনও অ্যারে বাছাই করার কোনও সহজ উপায় আছে ?

অথবা আমাকে কী অলস হওয়া বন্ধ করতে হবে এবং নিজেই এটি করতে হবে: [


উত্তর:


330

আপনি এটি সমস্ত ধরণের অবজেক্টগুলিকে বাছাই করতে ব্যবহার করতে পারেন

sort(T[] a, Comparator<? super T> c) 

Arrays.sort(a, Collections.reverseOrder());

Arrays.sort()আদি ক্রমকে ক্রমবর্ধমান ক্রমে বাছাই করতে সরাসরি ব্যবহার করা যায় না। যদি আপনি Arrays.sort()বিপরীত তুলনামূলক দ্বারা সংজ্ঞায়িত করে পদ্ধতিটি কল করার চেষ্টা করেন তবে Collections.reverseOrder()এটি ত্রুটিটি ছুঁড়ে দেবে

বাছাইয়ের জন্য উপযুক্ত পদ্ধতি খুঁজে পাওয়া যায় নি (int [], তুলনামূলক)

এটি পূর্ণসংখ্যার অ্যারের মতো 'অ্যারে অবজেক্টস' এর সাথে দুর্দান্ত কাজ করবে তবে প্রারম্ভিক অ্যারে যেমন ইনট অ্যারের সাথে কাজ করবে না।

একটি আদিম অ্যারেটিকে অবতরণ ক্রমে বাছাই করার একমাত্র উপায় হ'ল প্রথমে অ্যারেটিকে আরোহণের ক্রমে বাছাই করুন এবং তারপরে অ্যারেটি বিপরীতভাবে স্থির করুন। এটি দ্বি-মাত্রিক আদিম অ্যারেগুলির ক্ষেত্রেও সত্য।


115
এটি
আদিমদের

14
আপনার আদিমকে তাদের নিজ নিজ বস্তুতে রূপান্তর করুন। Int জন্য পূর্ণসংখ্যা, ডবল জন্য ডাবল, বুলিয়ান-এর জন্য বুলিয়ান, ইত্যাদি
ইসমাঈল

12
যদি আপনি এখনও আপনার কাস্টম তুলনা করতে চান :Collections.reverseOrder(this)
সেবাস্তিয়ান হোজাস

কালেকশনস.রেভারসর্ডার () কোনও প্যারামিটার নেয় না (যদি না আমি কিছু মিস করছি?), এর পরিবর্তে আমি myComparator.reversed () ব্যবহার করেছি।
jsaven

1
Arrays.sort () আদি ক্রমকে সাজিয়ে তোলার জন্য সরাসরি ব্যবহার করা যায় না। আপনি যদি কালেকশন.রেভারসর্ডার () দ্বারা সংজ্ঞায়িত বিপরীত তুলনা করে পাস করে অ্যারে.সোর্ট () পদ্ধতিতে কল করার চেষ্টা করেন, এটি ত্রুটিটি ছুঁড়ে ফেলবে - "সাজানোর জন্য কোনও উপযুক্ত পদ্ধতি পাওয়া যায় নি (int [], তুলনামূলক <object>)" এটি হবে পূর্ণসংখ্যার অ্যারের সাথে সূক্ষ্মভাবে কাজ করে তবে কোনও int অ্যারে দিয়ে কাজ করবে না। একটি আদিম অ্যারেটিকে অবতরণ ক্রমে বাছাই করার একমাত্র উপায় হ'ল প্রথমে অ্যারেটিকে আরোহণের ক্রমে বাছাই করুন এবং তারপরে অ্যারেটি বিপরীতভাবে স্থির করুন। এটি দ্বি-মাত্রিক আদিম অ্যারেগুলির ক্ষেত্রেও সত্য।
আকুরিয়াকো

96

একটি তালিকা জন্য

Collections.sort(list, Collections.reverseOrder());

একটি অ্যারের জন্য

Arrays.sort(array, Collections.reverseOrder());

25
int [] অ্যারে = {2,4,3,6,8,7}; অ্যারে.সোর্ট (অ্যারে, কালেকশনস.রেভারস অর্ডার ()); আমাকে ত্রুটি দিচ্ছে! ত্রুটিটি হ'ল: "অ্যারে টাইপের পদ্ধতি অনুসারে (int []) আর্গুমেন্টের জন্য প্রযোজ্য নয় (int [], তুলনাকারী <অবজেক্ট>)"
দীক্ষিত সিঙ্গলা

8
int কোন অবজেক্ট নয়। পরিবর্তে পূর্ণসংখ্যা [] ব্যবহার করার চেষ্টা করুন।
অরনিথোপ্টার

6
পূর্ণসংখ্যা একটি প্রাথমিক টাইপ হয় যখন পূর্ণসংখ্যা হয় না। এজন্য পূর্ণসংখ্যার পার্স, টো স্ট্রিং ইত্যাদির মতো পদ্ধতি রয়েছে
অরনিথোপ্টার

91

আপনি এটি ব্যবহার করতে পারেন:

    Arrays.sort(data, Collections.reverseOrder());

Collections.reverseOrder()Comparatorবিপরীত প্রাকৃতিক ক্রম ব্যবহার করে একটি ফেরত দেয় । আপনি ব্যবহার করে আপনার নিজস্ব তুলক একটি উল্টানো সংস্করণ পেতে পারেন Collections.reverseOrder(myComparator)


8
ওপি একটি অ্যারে বাছাই করতে চায়। Collections.sort()একটি Listইনপুট প্যারামিটার হিসাবে নেয় , অ্যারে নয়।
পাস্কাল থিভেন্ট

61

বিকল্প হতে পারে (সংখ্যার জন্য !!!)

  1. অ্যারে -1 দ্বারা গুণান
  2. সাজান
  3. -1 দিয়ে আবার গুন করুন

আক্ষরিকভাবে বলা:

array = -Arrays.sort(-array)

7
এই সংখ্যাটি আসলে সৃজনশীল যদি আমরা সংখ্যার বাছাই করে থাকি, যদিও এটি জেনেরিক না এবং ওভারফ্লোতে সমস্যা সৃষ্টি করতে পারে ...
হ্যাকজুতসু

3
এটি আদিম ধরণের জন্য খুব ভাল উত্তর। তুমি প্রতিভাবান.
হালিল İब्रাহিম ওয়াম্যাক

2
ছাড়া এটি করব ব্যর্থ জন্য Integer.MIN_VALUE(অথবা যেটা আদিম ব্যবহার করা হয়)। sort()তারপরে আরও ভাল হবে তবে reverse()তারা নিজেকে বিপরীত করতে হবে, কারণ তারা Arrays.reverse()বাস্তবায়ন যোগ করেনি didn't
আন্দ্রেয়াস

1
@ হালিল আব্রাহিম ওয়াম্যাক: -আরয়ে সিনট্যাক্সটি আমার পক্ষে কাজ করে না: "খারাপ অপারেন্ড টাইপ ইন্ট [] আনরি অপারেটরের জন্য '-'"
লাইন

8
@ লাইনটি অ্যারে করতে আপনাকে একাধিক -1 করতে হবে। উপরের কোডটি সিউডো কোড। আপনি লুপের জন্য অ্যারে একাধিক -1 করতে পারেন তারপরে অ্যারে.সোর্ট () পদ্ধতিতে কল করুন, শেষ পর্যন্ত আপনি আবার অ্যারেতে একাধিক -1 করতে পারেন।
হালিল İব্রাহিম ওমামাক

47

সুস্পষ্ট তুলনামূলক ছাড়াই:

Collections.sort(list, Collections.reverseOrder());

সুস্পষ্ট তুলনামূলক সহ:

Collections.sort(list, Collections.reverseOrder(new Comparator()));

10

জাভা 8:

Arrays.sort(list, comparator.reversed());

আপডেট: reversed()নির্দিষ্ট তুলনামূলক বিপরীত। সাধারণত, তুলনাকারীরা আরোহণের অর্ডার দেয়, সুতরাং এটি ক্রমকে নীচে নামার ক্ষেত্রে পরিবর্তন করে।


1
এটি অবজেক্টের সাথে পুরোপুরি কাজ করে তবে আদিমগুলির সাথে নয়। আদিম ইন বাছাইয়ের জন্য, আপনাকে এএসসি ক্রম অনুসারে বাছাই করা উচিত এবং তারপরে উত্তরটি উল্টো করুন।
রাসেল স্ক।

5

অ্যারেতে আদিম উপাদান রয়েছে এমন অ্যারেগুলির org.apache.commons.lang(3)বিপরীত করার সহজ উপায় থাকলে (এটিকে সাজানোর পরে) ব্যবহার করা হয়:

ArrayUtils.reverse(array);

1
কেন এটি প্রথমে আরোহী ক্রমে সাজান এবং তারপরে এই অর্ডারটি ফিরিয়ে আনতে বাহ্যিক গ্রন্থাগার ব্যবহার করবেন, যখন এটি এক ধাপে করা যায়?
বেতলিস্টা

এবং যে একটি পদক্ষেপ হচ্ছে?
জোসিপ মাসলাক

5
হ্যাঁ তবে (সেই উত্তরগুলির মন্তব্যে যেমন বলা হয়েছে) যেটি আমার উত্তরের ঠিকানা হিসাবে আদিমদের পক্ষে কাজ করে না। অবশ্যই আমার উত্তরটি সর্বোত্তম নয় তবে এটি "সহজ" হওয়ার মানদণ্ডটি পূরণ করতে পেরেছি যা মূল লেখক জোর দিয়েছিলেন - যেমন। Arrays.sort(primitives); ArrayUtils.reverse(primitives);
জোসিপ মাসলাক

5

প্রথমে আপনাকে আপনার অ্যারেটি বাছাই করতে হবে:

Collections.sort(Myarray);

তারপরে আপনাকে ক্রমটি আরোহী থেকে অবতরণ পর্যন্ত ব্যবহার করে বিপরীত করতে হবে:

Collections.reverse(Myarray);

4

আপনার ব্যবহারের ক্ষেত্রে কী ছিল তা আমি জানি না, তবে এখানে অন্যান্য উত্তরের পাশাপাশি আরও একটি (অলস) বিকল্পটি হ'ল আরোহণের ক্রমানুসারে সাজানো যেমন আপনি ইঙ্গিত করেছেন তবে তারপরে বিপরীত ক্রমে পুনরাবৃত্তি করতে হবে।


4

আদিম (যেমন int[] arr = {1, 2, 3};) ব্যবহার করে একটি অ্যারের বিপরীত করা সরাসরি সম্ভব নয় Arrays.sort()এবং Collections.reverseOrder()কারণ এই পদ্ধতিগুলির Integerজন্য আদিম প্রকারের ( int) পরিবর্তে রেফারেন্স ধরণের ( ) প্রয়োজন হয় ।

তবে আমরা বিপরীত ক্রমে সাজানোর জন্য প্রথমে অ্যারে বাক্স করতে জাভা 8 স্ট্রিম ব্যবহার করতে পারি:

// an array of ints
int[] arr = {1, 2, 3, 4, 5, 6};

// an array of reverse sorted ints
int[] arrDesc = Arrays.stream(arr).boxed()
    .sorted(Collections.reverseOrder())
    .mapToInt(Integer::intValue)
    .toArray();

System.out.println(Arrays.toString(arrDesc)); // outputs [6, 5, 4, 3, 2, 1]

3

আর একটি সমাধান হ'ল আপনি যদি এটির ব্যবহার করছেন তুলনামূলক ইন্টারফেসটি আপনি যে তুলনা করতে পারেন তুলনায় আপনার নির্ধারিত আউটপুট মানগুলি স্যুইচ করতে পারেন (অবজেক্ট বি-কম্পার্ড)।

উদাহরণ স্বরূপ :

public int compareTo(freq arg0) 
{
    int ret=0;
    if(this.magnitude>arg0.magnitude)
        ret= 1;
    else if (this.magnitude==arg0.magnitude)
        ret= 0;
    else if (this.magnitude<arg0.magnitude)
        ret= -1;
    return ret;
}

কোথায় মাত্রার ডাটাটাইপ সঙ্গে একটি বৈশিষ্ট্য হল ডবল আমার প্রোগ্রামে। এটি আমার সংজ্ঞায়িত শ্রেণীর ফ্রিকিক্সটিকে তার প্রস্থের দ্বারা বিপরীত ক্রমে বাছাই করছিল । সুতরাং এটি সংশোধন করার জন্য, আপনি <এবং দ্বারা ফিরে আসা মানগুলি স্যুইচ করুন >। এটি আপনাকে নিম্নলিখিত দেয়:

public int compareTo(freq arg0) 
{
    int ret=0;
    if(this.magnitude>arg0.magnitude)
        ret= -1;
    else if (this.magnitude==arg0.magnitude)
        ret= 0;
    else if (this.magnitude<arg0.magnitude)
        ret= 1;
    return ret;
}

এই তুলনাটি ব্যবহার করতে, আমরা কেবল কল করি Arrays.sort(mFreq)যা আপনাকে সাজানো অ্যারে দেবেfreq [] mFreq

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



0

আমি জানি যে এটি বেশ পুরানো থ্রেড, তবে এখানে পূর্ণসংখ্যা এবং জাভা 8 এর জন্য একটি আপডেট সংস্করণ রয়েছে:

Arrays.sort(array, (o1, o2) -> o2 - o1);

নোট করুন যে এটি স্বাভাবিক ওঠার ক্রম (অথবা তুলনামূলক ডটকম্পারিং ইন্ট ()) এর জন্য "o1 - o2"।

এটি অন্য যে কোনও ধরণের অবজেক্টের জন্যও কাজ করে। বলুন,

Arrays.sort(array, (o1, o2) -> o2.getValue() - o1.getValue());

1
এটি কেবল প্রারম্ভিক ধরণের অ্যারেগুলির জন্য কাজ করে, আদিম ধরণের অ্যারেগুলিতে নয়।
কিমবাডি

0

এটি আমার পক্ষে কাজ করেছে:

package doublearraysort;

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

public class Gpa {


    public static void main(String[] args) {
        // initializing unsorted double array
        Double[] dArr = new Double[] {                 
            new Double(3.2),
            new Double(1.2),
            new Double(4.7),
            new Double(3.3),
            new Double(4.6),
           };
        // print all the elements available in list
        for (double number : dArr) {
            System.out.println("GPA = " + number);
        }

        // sorting the array
        Arrays.sort(dArr, Collections.reverseOrder());

        // print all the elements available in list again
        System.out.println("The sorted GPA Scores are:");
        for (double number : dArr) {
            System.out.println("GPA = " + number);
        }
    }
}

আউটপুট:

GPA = 3.2
GPA = 1.2
GPA = 4.7
GPA = 3.3
GPA = 4.6
The sorted GPA Scores are:
GPA = 4.7
GPA = 4.6
GPA = 3.3
GPA = 3.2
GPA = 1.2

0
public double[] sortArrayAlgorithm(double[] array) { //sort in descending order
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array.length; j++) {
            if (array[i] >= array[j]) {
                double x = array[i];
                array[i] = array[j];
                array[j] = x;
            }
        }
    }
    return array;
}

কেবল সাজানোর জন্য দ্বিগুণ প্রকারের অ্যারে বাছাই করার জন্য এই পদ্ধতিটি ব্যবহার করুন, আপনি কেবল "রিটার্ন টাইপ", "আর্গুমেন্ট টাইপ" পরিবর্তন করে এবং অন্য কোনও ধরণের অ্যারে বাছাই করতে ব্যবহার করতে পারেন (যেমন int, ফ্লোট, এবং ইত্যাদি) ভেরিয়েবল "x" প্রকারটি সংশ্লিষ্ট প্রকারে প্রযোজ্য। অর্ডার আরোহণের জন্য আপনি যদি "> =" "<=" তে পরিবর্তন করতে পারেন তবে শর্তটি আরোহণ করুন।


0

আপনি Comparator.reverseOrder () এর সাথে স্ট্রিম অপারেশন ( কালেকশন.স্ট্রিম () ) ব্যবহার করতে পারেন ।

উদাহরণস্বরূপ, বলুন যে আপনার কাছে এই সংগ্রহ রয়েছে:

List<String> items = new ArrayList<>();
items.add("item01");
items.add("item02");
items.add("item03");
items.add("item04");
items.add("item04");

আইটেমগুলিকে তাদের "প্রাকৃতিক" ক্রমে মুদ্রণ করতে আপনি বাছাই করা () পদ্ধতিটি ব্যবহার করতে পারেন (বা এটি ছেড়ে দিয়ে একই ফলাফল পেতে পারেন):

items.stream()
     .sorted()
     .forEach(item -> System.out.println(item));

বা এটিকে অবতরণ (বিপরীত) ক্রমে মুদ্রণ করতে আপনি বাছাই করা পদ্ধতিটি তুলনামূলক গ্রহণ করতে পারেন এবং ক্রমটি বিপরীত করেছেন:

items.stream()
     .sorted(Comparator.reverseOrder())
     .forEach(item -> System.out.println(item));

নোট করুন এর জন্য তুলনামূলক (যেমন পূর্ণসংখ্যা, স্ট্রিং ইত্যাদি) প্রয়োগ করা দরকার implemented


0

এখানে প্রচুর গণ্ডগোল চলছে - লোকেরা আদিম মানগুলির সমাধানের পরামর্শ দেয়, স্থল থেকে কিছু বাছাইয়ের আলগোগুলি বাস্তবায়নের চেষ্টা করে, অতিরিক্ত গ্রন্থাগারগুলির সাথে জড়িত সমাধান দেয়, কিছু হ্যাকি দেখায় ইত্যাদি। মূল প্রশ্নের উত্তর 50 টি / 50। যারা কেবল অনুলিপি / পেস্ট করতে চান তাদের জন্য:

// our initial int[] array containing primitives
int[] arrOfPrimitives = new int[]{1,2,3,4,5,6};

// we have to convert it into array of Objects, using java's boxing
Integer[] arrOfObjects = new Integer[arrOfPrimitives.length];
for (int i = 0; i < arrOfPrimitives.length; i++) 
    arrOfObjects[i] = new Integer(arrOfPrimitives[i]);

// now when we have an array of Objects we can use that nice built-in method
Arrays.sort(arrOfObjects, Collections.reverseOrder());

arrOfObjectsহয় {6,5,4,3,2,1}এখন। আপনার যদি ইনট ব্যতীত অন্য কিছুর একটি অ্যারে থাকে - এর পরিবর্তে সংশ্লিষ্ট অবজেক্টটি ব্যবহার করুন Integer


0

উপরের আলোচনার জন্য, এখানে আদি ক্রমকে সাজানোর জন্য সহজ উদাহরণ।

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        int[] nums = { 5, 4, 1, 2, 9, 7, 3, 8, 6, 0 };
        Arrays.sort(nums);

        // reverse the array, just like dumping the array!
        // swap(1st, 1st-last) <= 1st: 0, 1st-last: nums.length - 1
        // swap(2nd, 2nd-last) <= 2nd: i++,  2nd-last: j--
        // swap(3rd, 3rd-last) <= 3rd: i++,  3rd-last: j--
        //
        for (int i = 0, j = nums.length - 1, tmp; i < j; i++, j--) {
            tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }

        // dump the array (for Java 4/5/6/7/8/9)
        for (int i = 0; i < nums.length; i++) {
            System.out.println("nums[" + i + "] = " + nums[i]);
        }
    }
}

আউটপুট:

nums[0] = 9
nums[1] = 8
nums[2] = 7
nums[3] = 6
nums[4] = 5
nums[5] = 4
nums[6] = 3
nums[7] = 2
nums[8] = 1
nums[9] = 0

0

একটি int অ্যারে অবতরণ সাজানোর সহজ পদ্ধতি:

private static int[] descendingArray(int[] array) {
    Arrays.sort(array);
    int[] descArray = new int[array.length];
    for(int i=0; i<array.length; i++) {
        descArray[i] = array[(array.length-1)-i];
    }
    return descArray;
}

-1

তুলনামূলক সঙ্গে অন্য উপায়

import java.util.Arrays;
import java.util.Comparator;
...

Integer[] aInt = {6,2,3,4,1,5,7,8,9,10};
Arrays.sort(aInt, Comparator.reverseOrder()  );
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.