বর্ণানুক্রমিক ক্রমে অ্যারেলিস্ট বাছাই করা হচ্ছে (সংবেদনশীল ক্ষেত্রে)


121

আমার কাছে একটি স্ট্রিং অ্যারেলিস্ট namesরয়েছে যাতে মানুষের নাম রয়েছে। আমি বর্ণমালা অনুসারে অ্যারেলিস্টটি বাছাই করতে চাই।

ArrayList<String> names = new ArrayList<String>();
names.add("seetha");
names.add("sudhin");
names.add("Swetha");
names.add("Neethu");
names.add("ananya");
names.add("Athira");
names.add("bala");
names.add("Tony");
names.add("Karthika");
names.add("Nithin");
names.add("Vinod");
names.add("jeena");
Collections.sort(names);
for(int i=0; i<names.size(); i++)
    System.out.println(names.get(i));

আমি উপরের উপায়ে তালিকাটি সাজানোর চেষ্টা করেছি। তবে এটি সাজানো অ্যারে হিসাবে প্রদর্শিত হচ্ছে:

Athira
Karthika
..
..
ananya
bala
...

তবে আমি এটিকে সংবেদনশীল করতে চাই না। আমি ফলাফলটি চাই:

ananya
Athira
bala

উত্তর:


330

কাস্টম Comparatorসাহায্য করা উচিত

Collections.sort(list, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
});

বা আপনি যদি জাভা 8 ব্যবহার করছেন:

list.sort(String::compareToIgnoreCase);

1
আপনি কি আমাকে বলতে পারবেন যে স্ট্রিং এস 1 এবং এস 2 কী? এবং যদি ফলাফলটি কীভাবে দেখতে পাওয়া যায় তবে তুলনা ফাংশনটি পূর্ণসংখ্য মান প্রদান করে।
andro-girl

@ সীতলক্ষ্মী এটি আপনার তালিকা থেকে এসেছে। দয়া করে Collections.sort পদ্ধতি উৎস কটাক্ষপাত করা আপনি যে আরো বিবরণ পেতে চান তাহলে
denis.solonenko

আমি লগক্যাটে বাছাই করা তালিকাটি প্রদর্শন করতে চাই ow আমি কীভাবে এটি করতে পারি?
andro-girl

আপনি যদি বাছাইয়ের পরে লুপটি তালিকায় না ভাঙেন এটি অবজেক্ট হিসাবে প্রদর্শিত হবে as for (TYPE newvariable : ARRAYTYPE arrayname) { Log.i("YOURAPPTAG", newvariable); }
পরিত্যক্ত কার্ট

2
@ ড্যান্ট যদি আপনি এর বাস্তবায়নটি একবার দেখে থাকেন String.CASE_INSENSITIVE_ORDERতবে আপনি দেখতে পাবেন যে A1 lessA10 এর চেয়ে কম মাত্রায় দৈর্ঘ্যের কারণে কম ired কোন "স্বাভাবিক সাজানোর" বাক্সের বাইরে সমর্থন থাকে, তবে আপনি কটাক্ষপাত করা করতে চাইবেন stackoverflow.com/questions/1262239/...
denis.solonenko

195

সহজ কাজটি হ'ল:

Collections.sort(list, String.CASE_INSENSITIVE_ORDER);

@ ডিজুনোদ, উত্তরের জন্য ধন্যবাদ। আমি A1 থ্রো এ 10 থেকে অ্যারেলিস্টের জন্য আপনার সমাধানটি চেষ্টা করেছি, কিন্তু এ 10 ডেনিস.সোলেটেনকো এর সমাধানের মতো ঠিকভাবে সাজান নি। একরকম, A10 A1 পরে যায়। মূলত, এটি A1, A10, A2, A3 ইত্যাদির মতো বাছাই করা হয়েছে কেন এটি ঘটেছিল এবং আমি কীভাবে তালিকাটিকে সঠিকভাবে বাছাই করতে পারি?
দান্তে

2
@ উদ্যান্ত, এটি সাধারণ স্ট্রিং বাছাই। আপনি যদি এ 10 এর আগে A2 আসতে চান তবে আপনাকে এটি A02, ইত্যাদিতে পরিবর্তন করতে হবে
djod

1
প্লাস 1. অ্যান্ড্রয়েডেও কাজ করেছেন। ধন্যবাদ এবং অভিনন্দন।
স্ট্যাটোসডটকম

@ ডিজুনোদ ইউ কে অনেক ধন্যবাদ :)
কুমার

স্ট্যাকওভারফ্লো আমাকে উত্তর / স্নিপেটগুলি সংরক্ষণ করার জন্য একটি বিকল্প সরবরাহ করবে ..
এইচবি।

29

এই কোড চেষ্টা করুন

Collections.sort(yourarraylist, new SortBasedOnName());



import java.util.Comparator;
import com.RealHelp.objects.FBFriends_Obj;
import com.RealHelp.ui.importFBContacts;

public class SortBasedOnName implements Comparator
{
public int compare(Object o1, Object o2) 
{

    FBFriends_Obj dd1 = (FBFriends_Obj)o1;// where FBFriends_Obj is your object class
    FBFriends_Obj dd2 = (FBFriends_Obj)o2;
    return dd1.uname.compareToIgnoreCase(dd2.uname);//where uname is field name
}

}

3
দুর্দান্ত উত্তর! আমি মনে করি আপনি যদি 'প্রয়োগকারী তুলনাকারী' পরিবর্তন করে "প্রয়োগকারী তুলনাকারী <এফবিফ্রেন্ডস_অবজ> এবং আপনি এফবিফ্রেন্ডস_অবজ এর সাথে তুলনা করে অবজেক্টের ধরণগুলি পরিবর্তন করেন তবে আপনাকে ডিডি 1 এবং ডিডি 2 এর দরকার নেই আপনি রিটার্ন বিবৃতিতে সরাসরি o1 এবং o2 ব্যবহার করতে পারেন
ফ্রিংকব্রেভ

11

উল্লিখিত উত্তরের উপর ভিত্তি করে, আমি আমার কাস্টম ক্লাস অবজেক্টগুলি এর সাথে তুলনা করতে সক্ষম হয়েছি:

ArrayList<Item> itemList = new ArrayList<>();
...
Collections.sort(itemList, new Comparator<Item>() {
            @Override
            public int compare(Item item, Item t1) {
                String s1 = item.getTitle();
                String s2 = t1.getTitle();
                return s1.compareToIgnoreCase(s2);
            }

        });

4

আপনার পছন্দসই তুলনামূলক ব্যবহার করতে হবে যা ব্যবহার করবে compareToIgnoreCase, তুলনা করুন না।


আমি এই লিঙ্কটি চেষ্টা করেছি ut তবে আমি কী সমাধান খুঁজে পেতে পারছি না? আপনি কি ব্যাখ্যা করতে পারেন
andro-girl

3

জাভা 8 থেকে শুরু করে আপনি ব্যবহার করতে পারেন Stream:

List<String> sorted = Arrays.asList(
                          names.stream().sorted(
                              (s1, s2) -> s1.compareToIgnoreCase(s2)
                          ).toArray(String[]::new)
                      );

এটি সেখান থেকে একটি স্ট্রিম পায় ArrayList, তারপরে এটি এটিকে সাজায় (কেস উপেক্ষা করে)। এর পরে, স্ট্রিমটি একটি অ্যারেতে রূপান্তরিত হয় যা একটিতে রূপান্তরিত হয় ArrayList

আপনি যদি ফলাফলটি মুদ্রণ করে ব্যবহার করেন:

System.out.println(sorted);

আপনি নিম্নলিখিত আউটপুট পেতে:

[ananya, Athira, bala, jeena, Karthika, Neethu, Nithin, seetha, sudhin, Swetha, Tony, Vinod]

3

দুর্ভাগ্যক্রমে, এখনও অবধি সমস্ত উত্তর বিবেচনায় নেই যে এটি বাছাইয়ের সময় "a"সমান হিসাবে বিবেচিত হবে না "A"

String[] array = {"b", "A", "C", "B", "a"};

// Approach 1
Arrays.sort(array);
// array is [A, B, C, a, b]

// Approach 2
Arrays.sort(array, String.CASE_INSENSITIVE_ORDER);
// array is [A, a, b, B, C]

// Approach 3
Arrays.sort(array, java.text.Collator.getInstance());
// array is [a, A, b, B, C]

1 পন্থায় কোনও ছোট ছোট অক্ষর বড় হাতের অক্ষরের চেয়ে বড় হিসাবে বিবেচিত হয়।

পদ্ধতির 2 এটি আরও খারাপ করে তোলে, যেহেতু CASE_INSENSITIVE_ORDER বিবেচনা করে "a"এবং "A"সমতুল্য হয় ( তুলনার ফলাফলটি হয় 0)। এটি বাছাই অ-নিরস্তকারী করে তোলে।

পদ্ধতির 3 (একটি java.text.Clator ব্যবহার করে) এটি সঠিকভাবে করার একমাত্র উপায় IMHO, যেহেতু এটি বিবেচনা করে "a"এবং "A"সমান নয়, তবে বর্তমান (বা অন্য কোনও পছন্দসই) লোকেল অনুসারে এগুলি সঠিক ক্রমে রাখে।

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