让我们说,例如我有相同的 2个字符串,但第一个字符串以 大写字母和第二个字母不是。 现在,我需要使用CompareTo方法在小写字母之前输入大写字母。 我怎么做?因为CompareTo方法会以相反的方式对它们进行排序。
示例:列表= {"世界"," Aple","世界"," aple","您好& #34;} 我希望得到的顺序是:" Aple"," Hello"," World"," aple"," world&# 34 ;.意思是,无论如何,大写字母都是第一位的。
答案 0 :(得分:3)
尝试
public class StringSorter {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("apple");
list.add("Hello");
list.add("Apple");
list.add("World");
list.add("hello");
Collections.sort(list,
new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.equalsIgnoreCase(o2)){
return o1.compareTo(o2);
}
return o1.toUpperCase().compareTo(o2.toUpperCase());
}
});
System.out.println(list);
// in a shorter way with java-8
list.sort(Comparator.comparing(String::toLowerCase));
}
}
答案 1 :(得分:1)
答案 2 :(得分:0)
这是字符串比较的标准实现:
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
您需要编写一个这样的方法来更改char值,例如:交换大写和小写。然后正如netinept所说的那样,在排序算法中使用它作为“比较”和“比较”。覆盖或&#39;可比较&#39;实施
答案 3 :(得分:0)
这样的事情应该有效 - 我正在修补回报,以便它可能会改变。
static class CasedStringComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
if ( o1 == null ) {
return -1;
}
if ( o2 == null ) {
return 1;
}
for ( int i = 0; i < Math.min(o1.length(), o2.length()); i++ ) {
char c1 = o1.charAt(i);
char c2 = o2.charAt(i);
if ( Character.isUpperCase(c1) && !Character.isUpperCase(c2)) {
return -1;
}
if ( !Character.isUpperCase(c1) && Character.isUpperCase(c2)) {
return 1;
}
int diff = Character.compare(c1, c2);
if (diff != 0) {
return diff;
}
}
if ( o1.length() < o2.length() ) {
return -1;
}
return 0;
}
}
但正如@GriffeyDog指出的那样 - 这不会改变默认排序,它也会将大写字母置于小写之前。
答案 4 :(得分:0)
我喜欢Syam S的回答。想到以不同的方式尝试。 我相信它也相对有效率
关闭课程 - 添加空检查:)
Collections.sort(list,
new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int min = Math.min(o1.length(), o2.length());
for (int k = 0; k < min ; k++ ){
char c1 = o1.charAt(k);
char c2 = o2.charAt(k);
if (c1 != c2 ){
char u1 = Character.toUpperCase(c1);
char u2 = Character.toUpperCase(c2);
if (u1 == u2) {
return Character.isUpperCase(c1) ? -1 : 1;
}else{
return u1 - u2;
}
}
}
return o1.length() - o2.length();
}
});