আমি কীভাবে একটি তালিকা বর্ণানুক্রমিকভাবে বাছাই করতে পারি?


উত্তর:


217

এগুলি স্ট্রিংস ধরে নিলে সুবিধাজনক স্ট্যাটিক পদ্ধতিটি ব্যবহার করুন sort...

 java.util.Collections.sort(listOfCountryNames)

আপনার যদি "যুক্তরাজ্য" এর মতো দেশের নাম থাকে তবে তা ভেঙে যেতে চলেছে।
টম হাটিন -

1
এই ক্ষেত্রে, আপনি অতিরিক্ত যুক্তি হিসাবে তুলনামূলক পাস করতে পারেন। যদিও তুলনাকারীটি কার্যকর করা আকর্ষণীয় অংশ হবে।
থিলো

7
তুলনামূলক কার্যকর করা = java.text.Clator.getInstance ব্যবহার করুন
থিলো

143

সংগ্রহের সাথে সমাধান

আপনি যদি সেই তালিকাটি ব্যবহার করতে বাধ্য হন বা আপনার প্রোগ্রামটির মতো কাঠামো রয়েছে

  • তালিকা তৈরি করুন
  • কিছু দেশের নাম যুক্ত করুন
  • একবার তাদের বাছাই
  • আর কখনও সেই তালিকাটি পরিবর্তন করবেন না

তারপরে থিলোস উত্তর এটির সর্বোত্তম উপায়। যদি আপনি এটি টম হাটিনের পরামর্শের সাথে একত্রিত করেন - ট্যাকলাইন , আপনি পাবেন:

java.util.Collections.sort(listOfCountryNames, Collator.getInstance());

একটি ট্রিসেট দিয়ে সমাধান

আপনি যদি সিদ্ধান্ত নিতে নির্দ্বিধায় থাকেন এবং যদি আপনার অ্যাপ্লিকেশনটি আরও জটিল হয়ে উঠতে পারে তবে আপনি তার পরিবর্তে একটি ট্রিসেট ব্যবহার করার জন্য আপনার কোডটি পরিবর্তন করতে পারেন। এই ধরণের সংগ্রহগুলি আপনার প্রবেশের প্রবেশের সময় ঠিক সাজান। বাছাই করার দরকার নেই ()।

Collection<String> countryNames = 
    new TreeSet<String>(Collator.getInstance());
countryNames.add("UK");
countryNames.add("Germany");
countryNames.add("Australia");
// Tada... sorted.

আমি ট্রিসেটকে কেন পছন্দ করি তার সাইড নোট

এর কিছু সূক্ষ্ম, তবে গুরুত্বপূর্ণ সুবিধা রয়েছে:

  • এটি সহজ সংক্ষিপ্ত। যদিও শুধুমাত্র একটি লাইন সংক্ষিপ্ত।
  • এই তালিকাটি এখনই বাছাই করা নিয়ে চিন্তা করবেন না হবেন কারণ একটি ট্রিসেট সবসময় বাছাই করা হয়, আপনি যা কিছু করেন না তা নয়।
  • আপনার সদৃশ এন্ট্রি থাকতে পারে না। আপনার পরিস্থিতির উপর নির্ভর করে এটি কোনও প্রো বা কোনও শঙ্কু হতে পারে। আপনার যদি সদৃশ প্রয়োজন হয় তবে আপনার তালিকায় আটকে দিন।
  • একজন অভিজ্ঞ প্রোগ্রামার তাকান TreeSet<String> countyNamesএবং তাত্ক্ষণিকভাবে জানে: এটি নকল ছাড়াই স্ট্রিংয়ের সাজানো সংগ্রহ এবং আমি নিশ্চিত হতে পারি যে প্রতিটি মুহুর্তে এটি সত্য । সংক্ষিপ্ত ঘোষণায় এত তথ্য information
  • বাস্তব ক্ষেত্রে কিছু ক্ষেত্রে জয়। আপনি যদি একটি তালিকা ব্যবহার করেন এবং মানগুলি খুব ঘন ঘন সন্নিবেশ করান এবং তালিকাটি সেই সন্নিবেশগুলির মধ্যে পড়তে পারে তবে আপনাকে প্রতিটি সন্নিবেশের পরে তালিকাটি বাছাই করতে হবে। সেটটি একই কাজ করে তবে এটি আরও দ্রুত করে।

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

আমাকে ভুল করবেন না: কালেকশন.সোর্ট ব্যবহার করা কোনও ত্রুটি বা ত্রুটি নয়। তবে অনেকগুলি ক্ষেত্রে রয়েছে যখন ট্রিসেট অনেক বেশি পরিষ্কার থাকে।


সাজানোর ওপরে ট্রিসেট ব্যবহার করে আমি কোনও সুবিধা দেখছি না।
ডিজেক্লেওয়ার্থ

1
ওয়েল ট্রিসেট দুর্ঘটনাজনিত ডুপ্লিকেশন (যা ভাল বা খারাপ হতে পারে) এড়িয়ে চলে এবং এটি দ্রুত হওয়া উচিত (যদিও ইনপুটটির আকার দেওয়া না হলেও) এবং এটি সর্বদা ইনপুট পরে বাছাই না করে বাছাই করা হবে (যদি না আপনি প্রতিটিের পরে তালিকাটি বাছাই করেন) সন্নিবেশ করা) যা বিবেচনা করতে পারে তবে সম্ভবত তা নয়। এত দ্রুত ..
তোফুবিয়ার

1
@ তোফুবিয়ার আপনি যখন এটি করছেন তখন আমি এটি স্পষ্ট করে বলছিলাম। এবং যদি আপনি সত্যিই দ্রুত কী সম্পর্কে যত্নশীল হন, তাহলে stackoverflow.com/questions/168891/… দেখুন
লেনা শিমেল

7
আইটেমগুলি পরিবর্তনযোগ্য হলে একটি ট্রিসেট সাজানো থাকবে না।
জোশুয়া গোল্ডবার্গ

3
@ জোশুয়া গোল্ডবার্গ আমার মনে হয় এটি কেবল অ-বাছাই করা হবে না, এটি সঠিকভাবে কাজ করাও বন্ধ করবে। কমপক্ষে যদি বস্তুর রূপান্তরকরণটি এর বাছাইয়ের ক্রমকে প্রভাবিত করে। গাছের সেটটি তার কাজগুলি সম্পাদনের জন্য সাজানো আইটেমগুলির উপর নির্ভর করে (যেমন অনুসন্ধান করা, সরানো, সন্নিবেশ করা ...)।
লেনা শিমেল 12

28

আপনি জাভা 8 স্ট্রিম বা পেয়ারা ব্যবহার করে একটি নতুন সাজানো অনুলিপি তৈরি করতে পারেন:

// Java 8 version
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
// Guava version
List<String> sortedNames = Ordering.natural().sortedCopy(names); 

আর একটি বিকল্প হ'ল কালেকশন এপিআইয়ের মাধ্যমে স্থানে সাজানো:

Collections.sort(names);

28

আগের চেয়ে বেশি দেরী! এখানে আমরা কীভাবে এটি করতে পারি (কেবল শিখার উদ্দেশ্যে) -

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class SoftDrink {
    String name;
    String color;
    int volume; 

    SoftDrink (String name, String color, int volume) {
        this.name = name;
        this.color = color;
        this.volume = volume;
    }
}

public class ListItemComparision {
    public static void main (String...arg) {
        List<SoftDrink> softDrinkList = new ArrayList<SoftDrink>() ;
        softDrinkList .add(new SoftDrink("Faygo", "ColorOne", 4));
        softDrinkList .add(new SoftDrink("Fanta",  "ColorTwo", 3));
        softDrinkList .add(new SoftDrink("Frooti", "ColorThree", 2));       
        softDrinkList .add(new SoftDrink("Freshie", "ColorFour", 1));

        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //use instanceof to verify the references are indeed of the type in question
                return ((SoftDrink)softDrinkOne).name
                        .compareTo(((SoftDrink)softDrinkTwo).name);
            }
        }); 
        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.name + " - " + sd.color + " - " + sd.volume);
        }
        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //comparision for primitive int uses compareTo of the wrapper Integer
                return(new Integer(((SoftDrink)softDrinkOne).volume))
                        .compareTo(((SoftDrink)softDrinkTwo).volume);
            }
        });

        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.volume + " - " + sd.color + " - " + sd.name);
        }   
    }
}

4
আবার, এই কোডটির কোনও যৌক্তিকতা নেই যখন একটি লাইন করবে। লেনার উত্তর দেখুন।
james.garriss

1
এটি একটি অনুশীলন হিসাবে কাজ করতে পারে, তবে আমি যদি কখনও দেখি যে প্রোডাকশন কোডে, আমি এটি অক্ষরেখা করব। অবিলম্বে।
katzenhut

2
@ জেমস.গরিসস, লেনার উত্তরটি স্ট্রিংয়ের সহজ তালিকার জন্য ছিল, এটি বস্তুর তালিকার জন্য যাতে স্ট্রিং বৈশিষ্ট্য বাছাই করতে হবে।
মুনিব মীর্জা

হ্যাঁ এই উত্তরটি চূড়ান্তভাবে সহায়ক যখন বস্তুগুলির সাথে উত্পাদনে কাজ করার সময়। স্ট্রিংগুলির তালিকাটি সাধারণ নয়।
ডোমিনিক কে


9

এর জন্য দুটি যুক্তি ব্যবহার করুন Collections.sort। আপনি এমন উপযুক্ত চাইবেন Comparatorযা কেসকে উপযুক্ত হিসাবে বিবেচনা করে (যেমন ল্যাটিক্যাল করে তোলে, ইউটিএফ 16 ক্রম নয়) যেমন এর মাধ্যমে প্রাপ্ত java.text.Collator.getInstance


9

আপনি যদি কেবল অ্যাকসেন্ট-মুক্ত ইংরেজিতে স্ট্রিং বাছাই না করেন তবে আপনি সম্ভবত একটি ব্যবহার করতে চান Collator। এটি ডায়াক্রিটিকাল চিহ্নগুলিকে সঠিকভাবে বাছাই করবে, কেস এবং অন্যান্য ভাষা-নির্দিষ্ট জিনিসগুলিকে উপেক্ষা করতে পারে:

Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));

আপনি কলটার শক্তি সেট করতে পারেন, জাভাডক দেখুন।

এখানে স্লোভাকের জন্য উদাহরণ দেওয়া Šউচিত যেখানে তার পরে যাওয়া উচিত Sতবে ইউটিএফ- Šএ কোথাও কোথাও নেই Z:

List<String> countries = Arrays.asList("Slovensko", "Švédsko", "Turecko");

Collections.sort(countries);
System.out.println(countries); // outputs [Slovensko, Turecko, Švédsko]

Collections.sort(countries, Collator.getInstance(new Locale("sk")));
System.out.println(countries); // outputs [Slovensko, Švédsko, Turecko]

7

আপনি যা খুঁজছেন তা এখানে

listOfCountryNames.sort(String::compareToIgnoreCase)

1
È è ইত্যাদির সাথে ভাষাতে কাজ করে না ... আপনার আগে অ্যাকসেন্টগুলি সরিয়ে ফেলতে হবে
ভিনসেন্ট ডি

5

ব্যবহার করে Collections.sort(), আমরা একটি তালিকা বাছাই করতে পারেন।

public class EmployeeList {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        List<String> empNames= new ArrayList<String>();

        empNames.add("sudheer");
        empNames.add("kumar");
        empNames.add("surendra");
        empNames.add("kb");

        if(!empNames.isEmpty()){

            for(String emp:empNames){

                System.out.println(emp);
            }

            Collections.sort(empNames);

            System.out.println(empNames);
        }
    }
}

আউটপুট:

sudheer
kumar
surendra
kb
[kb, kumar, sudheer, surendra]

4

বর্ণমালা অবতরণ:

List<String> list;
...
Collections.sort(list);
Collections.reverse(list);

এই আমি খুঁজছিলাম ছিল। প্রথমে আমাকে তালিকাটি আবার এজেডে সারণি করতে হবে এবং তারপরে তুলনা করার জন্য জেডএতে হবে। ভাল উত্তর.
সোফিয়ে


0
//Here is sorted List alphabetically with syncronized
package com.mnas.technology.automation.utility;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;
/**
* 
* @author manoj.kumar
*/
public class SynchronizedArrayList {
static Logger log = Logger.getLogger(SynchronizedArrayList.class.getName());
@SuppressWarnings("unchecked")
public static void main(String[] args) {

List<Employee> synchronizedList = Collections.synchronizedList(new ArrayList<Employee>());
synchronizedList.add(new Employee("Aditya"));
synchronizedList.add(new Employee("Siddharth"));
synchronizedList.add(new Employee("Manoj"));
Collections.sort(synchronizedList, new Comparator() {
public int compare(Object synchronizedListOne, Object synchronizedListTwo) {
//use instanceof to verify the references are indeed of the type in question
return ((Employee)synchronizedListOne).name
.compareTo(((Employee)synchronizedListTwo).name);
}
}); 
/*for( Employee sd : synchronizedList) {
log.info("Sorted Synchronized Array List..."+sd.name);
}*/

// when iterating over a synchronized list, we need to synchronize access to the synchronized list
synchronized (synchronizedList) {
Iterator<Employee> iterator = synchronizedList.iterator();
while (iterator.hasNext()) {
log.info("Sorted Synchronized Array List Items: " + iterator.next().name);
}
}

}
}
class Employee {
String name;
Employee (String name) {
this.name = name;

}
}

কিন্তু কেন? কেন এই 50 টি লাইন কোড লেনার উত্তরে 1 লাইন কোডের চেয়ে বেশি ব্যবহার করা ভাল?
james.garriss

কারণ, বাছাই করা (তালিকার <T>, তুলক <? সুপার টি>) পদ্ধতিটি নির্দিষ্ট তুলনাকারীর দ্বারা প্ররোচিত আদেশ অনুসারে নির্দিষ্ট তালিকাটিকে বাছাই করতে ব্যবহৃত হয়। আপনি যখন এমপলইয়ের নাম ও বয়স অনুসারে একটি তালিকা বাছাই করতে চান তারপরে সংগ্রহ সংগ্রহগুলি বাছাই করুন পদ্ধতি (তালিকা,

না, দুঃখিত, এখানে কোনও ভালবাসা অনুভব করা হচ্ছে না। আপনি একটি পৃথক প্রশ্নের উত্তর দিচ্ছেন, কীভাবে কীভাবে তাদের সম্পত্তি অনুসারে অবজেক্টের তালিকা বাছাই করা যায়। আপনার কোডটি সে লক্ষ্যে কার্যকর হতে পারে তবে এটি ওপির প্রশ্নের পক্ষে ওভারকিল। :-(
james.garriss

-12

আমি যে পদ্ধতিটি তৈরি করেছি তা ব্যবহার করার চেষ্টা করতে পারেন।

String key- আপনার যে ক্রমটি চান তা হবে এবং এই ক্ষেত্রে বর্ণানুক্রমিকভাবে। শুধু "এবিসি ..." রেখে দিন।

String list[] - কীটি ব্যবহার করে আপনি যে তালিকাটি রাখতে চান তা।

int index - 0 হিসাবে সেট, কী জন্য অফসেট সেট করবে।

    public static String[] order(String key, String list[], int index) {
    ArrayList<String> order_List = new ArrayList<String>();
    ArrayList<String> temp_Order_List = null;
    char[] key_char = key.toCharArray();
    for (int offset = 0; offset < key_char.length; offset++) {
        if (key_char.length >= offset + index) {
            String str = (index > 1 ? list[0].substring(0, index - 1) : "")
                    + new String(key_char, offset, 1);
            for (int i = 0; i < list.length; i++) {
                temp_Order_List = new ArrayList<String>();
                for (int k = 0; k < list.length; k++) {
                    if (!order_List.contains(list[k])
                            && !temp_Order_List.contains(list[k])) {
                        if (list[k].equalsIgnoreCase(str))
                            order_List.add(list[k]);
                        else if (list[k].toLowerCase().startsWith(str.toLowerCase())) {
                            temp_Order_List.add(list[k]);

                        }
                    }
                }
                if (temp_Order_List.size() > 0) {
                    if (temp_Order_List.size() > 1) {
                        String[] add = order(key,
                                temp_Order_List.toArray(new String[temp_Order_List
                                        .size()]), index + 1);
                        for (String s : add) {
                            order_List.add(s);
                        }
                    } else {
                        order_List.add(temp_Order_List.get(0));
                    }
                }
            }
        }
    }
    return order_List.toArray(new String[order_List.size()]);
}

32
অবশ্যই, আমি যদি 30 টি লাইন কোড লিখতে পারি তবে java.util. Collections.sort (list) ব্যবহার করব কেন
Jirka

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