如何在忽略大小写的情况下按字母顺序排序?
Posted
技术标签:
【中文标题】如何在忽略大小写的情况下按字母顺序排序?【英文标题】:How to sort alphabetically while ignoring case sensitive? 【发布时间】:2011-11-20 03:26:27 【问题描述】:我有这个代码,但只适用于小写字母。我希望它在忽略大写字母的同时对列表进行排序..
package sortarray.com;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class SortArray extends Activity
ArrayList<String[]> matchedFruits = new ArrayList<String[]>();
TextView selection;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String fruits[] = new String[7];// Sorted array
fruits[0] = "apple";
fruits[1] = "apricot";
fruits[2] = "banana";
fruits[3] = "mango";
fruits[4] = "melon";
fruits[5] = "pineapple";
fruits[6] = "peach";
char currChar = fruits[0].charAt(0);// Get first char of first element
boolean match = false;
int len = fruits.length;
List<String> tmp = new ArrayList<String>();
for (int i = 1; i < len; i++)
Log.d("Comparing ", fruits[i].charAt(0) + "," + currChar);
if (fruits[i].charAt(0) == currChar)
if (match == false)// new match?
match = true;// Reset search
tmp.clear();// clear existing items
tmp.add(fruits[i - 1]);
Log.d("Started new list ", fruits[i - 1]);
else
tmp.add(fruits[i - 1]);
Log.d("Added to list ", fruits[i - 1]);
else
match = false;
tmp.add(fruits[i - 1]);
matchedFruits.add(tmp.toArray(new String[tmp.size()]));// add to
// final
// list
Log.d("Finished a list ", fruits[i - 1]);
tmp.clear();// clear existing items
currChar = fruits[i].charAt(0);
tmp.add(fruits[len - 1]);
matchedFruits.add(tmp.toArray(new String[tmp.size()]));// add left over
// items
printList();
void printList()
//Print the list
TextView selection = (TextView) findViewById(R.id.tv);
String mssg="";
for(int i=0;i<matchedFruits.size();i++)
String tmp2[]= matchedFruits.get(i);
for (int j = 0; j < tmp2.length; j++)
//Log.d("Final list", "Array #" + i + "[" + j + "]," + tmp2[j]);
mssg += tmp2[j].toString();
//selection.setText("\n");
selection.setText(mssg);
【问题讨论】:
你为什么不使用 sort() 之类的。像数组或集合那样? @jitender:你想做什么,能详细点吗? 我想按字典顺序对列表进行排序,同时忽略区分大小写的字母......即,如果我写 man 和 Mango,它们在排序后会一起出现在列表中。 我认为 jitender 正在寻找 自然排序 顺序,但我不知道为什么不使用 Collections.sort! @Tobiask...先生,我是初学者,所以对此有一点了解,请指导我如何使用它。 【参考方案1】:您是否尝试在if(fruits[i].charAt(0) == currChar)
和char currChar = fruits[0].charAt(0)
语句中将字符串的第一个字符转换为小写?
【讨论】:
【参考方案2】:非常不清楚您要做什么,但您可以像这样对列表进行排序:
List<String> fruits = new ArrayList<String>(7);
fruits.add("Pineapple");
fruits.add("apple");
fruits.add("apricot");
fruits.add("Banana");
fruits.add("mango");
fruits.add("melon");
fruits.add("peach");
System.out.println("Unsorted: " + fruits);
Collections.sort(fruits, new Comparator<String>()
@Override
public int compare(String o1, String o2)
return o1.compareToIgnoreCase(o2);
);
System.out.println("Sorted: " + fruits);
【讨论】:
先生,我想按字母顺序对列表进行排序..但是我的代码仅适用于小写单词它的作用是,它将大写单词打印在列表中。现在我想要的是按字母顺序对我的列表进行排序,而不考虑大小写。 您好先生,您能帮我解决这个问题吗..***.com/questions/7525851/… @David Caunt 好的,先生,我会自己解决的。【参考方案3】:这是一个简单的 Java 示例,说明了最好的方法:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Sorter
String fruits[] = new String[7];
List<String> lst;
Sorter()
lst = new ArrayList<String>();
// initialise UNSORTED array
fruits[0] = "Melon"; fruits[1] = "apricot"; fruits[2] = "peach";
fruits[3] = "mango"; fruits[4] = "Apple"; fruits[5] = "pineapple";
fruits[6] = "banana";
public static void main(String[] args)
Sorter srt = new Sorter();
srt.anyOldUnstaticMethod();
public void anyOldUnstaticMethod()
Collections.addAll(lst, fruits);
System.out.println("Initial List");
for (String s : lst)
System.out.println(s);
Collections.sort(lst);
System.out.println("\nSorted List");
for (String s : lst)
System.out.println(s);
Collections.sort(lst, new SortIgnoreCase());
System.out.println("\nSorted Ignoring Case List");
for (String s : lst)
System.out.println(s);
public class SortIgnoreCase implements Comparator<Object>
public int compare(Object o1, Object o2)
String s1 = (String) o1;
String s2 = (String) o2;
return s1.toLowerCase().compareTo(s2.toLowerCase());
【讨论】:
***.com/questions/203030/… 这要复杂得多。【参考方案4】:我喜欢比较器类 SortIgnoreCase
,但会使用它
public class SortIgnoreCase implements Comparator<String>
public int compare(String s1, String s2)
return s1.compareToIgnoreCase(s2); // Cleaner :)
【讨论】:
为什么不在菱形运算符中使用Collections.sort(listToSort, String.CASE_INSENSITIVE_ORDER);
【讨论】:
您不必创建自己的不区分大小写的字符串比较器,只需使用 String.CASE_INSENSITIVE_ORDER(Java 1.2 起) 如果我想传递两个属性,比如不敏感的顺序和逆序呢? @LuisA.Florit 在这种情况下,您可能需要比较器。 值得注意的是,这将修改现有列表,因此列表需要是可变的。 也可以写成:theList.sort(String.CASE_INSENSITIVE_ORDER)【参考方案6】:使用集合和 ArrayList 的示例:
开发一个实习生静态类,如示例“CompareStrings”。
在main方法中调用intern静态类。
简单易懂,效果很好!
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class MainClass
public static void main(String[] args)
ArrayList<String> myArray = new ArrayList<String>();
myArray.add("zzz");
myArray.add("xxx");
myArray.add("Aaa");
myArray.add("bb");
myArray.add("BB");
Collections.sort(myArray, new MainClass.CompareStrings());
for(String s : myArray)
System.out.println(s);
public static class CompareStrings implements Comparator<String>
@Override
public int compare(String s1, String s2)
return s1.compareToIgnoreCase(s2);
【讨论】:
【参考方案7】:在您的比较器工厂类中,执行以下操作:
private static final Comparator<String> MYSTRING_COMPARATOR = new Comparator<String>()
@Override
public int compare(String s1, String s2)
return s1.compareToIgnoreCase(s2);
;
public static Comparator<String> getMyStringComparator()
return MYSTRING_COMPARATOR;
这使用不区分大小写的比较方法(为什么要自己编写)。这样您就可以像这样使用集合排序:
List<String> myArray = new ArrayList<String>();
//fill your array here
Collections.sort(MyArray, MyComparators. getMyStringComparator());
【讨论】:
【参考方案8】:我不敢相信没有人提到Collator。几乎所有这些答案都只适用于英语。
您几乎应该始终使用Collator for dictionary based sorting。
对于搜索英语的不区分大小写的整理器,您可以执行以下操作:
Collator usCollator = Collator.getInstance(Locale.US);
usCollator.setStrength(Collator.PRIMARY);
Collections.sort(listToSort, usCollator);
【讨论】:
【参考方案9】:Collections.sort()
允许您传递自定义比较器进行排序。对于不区分大小写的排序,String
类提供了一个名为 CASE_INSENSITIVE_ORDER
的静态最终比较器。
所以在你的情况下,所有需要的是:
Collections.sort(caps, String.CASE_INSENSITIVE_ORDER);
【讨论】:
显然是最佳答案:)【参考方案10】:将java.text.Collator.getInstance()
传递给Collections.sort
方法;它将按字母顺序排序,同时忽略大小写。
ArrayList<String> myArray = new ArrayList<String>();
myArray.add("zzz");
myArray.add("xxx");
myArray.add("Aaa");
myArray.add("bb");
myArray.add("BB");
Collections.sort(myArray,Collator.getInstance());
【讨论】:
【参考方案11】:在您的情况下,您有一个 List
的字符串,并且大多数已经提出的解决方案(我特别喜欢 @guyblank 的答案)都很好,但是!!!,如果您有一个 List
的豆子,这是我的在这种情况下,您可以像这样在 bean 中使用 Comparable
接口:
public class UserBean implements Comparable<UserBean>
private String name;
private String surname;
private Integer phone;
// GETTERS AND SETTERS
public int compareTo(UserBean bean)
return name.compareToIgnoreCase(bean.name);
那么你只需要创建你的ArrayList<UserBean> userBeanArray = new ArrayList<UserBean>();
,填写并排序:Collections.sort(userBeanArray);
你已经完成了!
希望对社区有所帮助;-)
【讨论】:
【参考方案12】:这是一个对数组进行排序的示例:不区分大小写
import java.text.Collator;
import java.util.Arrays;
public class Main
public static void main(String args[])
String[] myArray = new String[] "A", "B", "b" ;
Arrays.sort(myArray, Collator.getInstance());
System.out.println(Arrays.toString(myArray));
/* 输出:[A, b, B] */
【讨论】:
【参考方案13】:从 Java 8 开始,您可以使用 Streams API 进行排序:
List<String> fruits = Arrays.asList("apple", "Apricot", "banana");
List<String> sortedFruit = fruits.stream()
.sorted(String.CASE_INSENSITIVE_ORDER)
.collect(Collectors.toList())
与Collections.sort
的不同之处在于,这将返回一个新列表,并且不会修改现有列表。
【讨论】:
【参考方案14】:你可以像这样直接调用列表中默认的sort方法:
myList.sort(String.CASE_INSENSITIVE_ORDER); // reads as the problem statement and cleaner
或:
myList.sort(String::compareToIgnoreCase); // reads as the problem statement and cleaner
【讨论】:
【参考方案15】:Java 8 Way 中的数组排序-> Easy peasy lemon squeezy
String[] names = "Alexis", "Tim", "Kyleen", "KRISTY";
Arrays.sort(names, String::compareToIgnoreCase);
我使用的方法参考String::compareToIgnoreCase
【讨论】:
以上是关于如何在忽略大小写的情况下按字母顺序排序?的主要内容,如果未能解决你的问题,请参考以下文章