如何在不考虑 java 中的特殊字符的情况下进行排序?
How to sort without considering special characters in java?
我想对一个名字列表进行排序,我使用了 compareTo 方法,我的列表中有这样的名字
$尤亚,
安迪,
王子,
@rikesh,
预期输出:
安迪,
王子,
$乌里亚,
@rikesh,
相反,我得到:
$乌里亚
@rikesh
安迪
王子
现在发生的事情是以特殊字符开头的名字排在第一位,然后对其他名字进行排序
有没有办法把以特殊字符开头的名字推到最后。
if (this.firstName == name.firstName) {
return 0;
} else if (this.firstName == null) {
return 1;
} else if (name.firstName == null) {
return -1;
} else {
return this.firstName.compareToIgnoreCase(name.firstName);
}
我认为您希望 $
被视为 S
。在这种情况下,在 compareTo 方法中,您必须将 $
替换为 S
(其他情况类似)并进行比较。
如果你不想考虑 $
本身(如问题所述),你必须用空字符替换特殊字符。
我做了一些修改,根据您的要求,我忽略了特殊字符:
在 compareTo 方法中,它必须看起来像这样:
if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) >0)
return 1;
else if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) < 0)
return -1;
并且控制台中的输出是:
before sort :[10-$urya, 10-andy, 10-prince, 10-@rikesh]
after sort :[10-andy, 10-prince, 10-@rikesh, 10-$urya]
忽略 10,10 是我的 Person 对象中的年龄。
看看我的类,你就明白了。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
public class ComaprableCheck {
public static void main(String[] args) {
ArrayList<Person> person = new ArrayList<Person>();
Person p = new Person();
p.age =10;
p.name ="$urya";
person.add(p);
p = new Person();
p.age =10;
p.name="andy";
person.add(p);
p = new Person();
p.age =10;
p.name ="prince";
person.add(p);
p = new Person();
p.age =10;
p.name ="@rikesh";
person.add(p);
System.out.println("before sort :"+person);
Collections.sort(person);
System.out.println("after sort :"+person);
}
}
public class Person implements Comparable<Person> {
public int age;
public String name;
@Override
public int compareTo(Person o) {
if(this.age > o.age)
return 1;
else if(this.age<o.age)
return -1;
else
{
if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) >0)
return 1;
else if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) < 0)
return -1;
}
return 0;
}
public String toString(){
return this.age+"-"+this.name;
}
}
下面的一段代码可以发挥作用。它在比较时忽略特殊字符,并相应地 returns 排序列表:
if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) >0)
return 1; else if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) < 0)
return -1;
Java 8 蒸汽 API 1 班轮
list.stream().filter(s -> s.replaceAll("[^a-zA-Z0-9]", "")).sorted()
我想对一个名字列表进行排序,我使用了 compareTo 方法,我的列表中有这样的名字
$尤亚, 安迪, 王子, @rikesh,
预期输出: 安迪, 王子, $乌里亚, @rikesh,
相反,我得到: $乌里亚 @rikesh 安迪 王子
现在发生的事情是以特殊字符开头的名字排在第一位,然后对其他名字进行排序
有没有办法把以特殊字符开头的名字推到最后。
if (this.firstName == name.firstName) {
return 0;
} else if (this.firstName == null) {
return 1;
} else if (name.firstName == null) {
return -1;
} else {
return this.firstName.compareToIgnoreCase(name.firstName);
}
我认为您希望 $
被视为 S
。在这种情况下,在 compareTo 方法中,您必须将 $
替换为 S
(其他情况类似)并进行比较。
如果你不想考虑 $
本身(如问题所述),你必须用空字符替换特殊字符。
我做了一些修改,根据您的要求,我忽略了特殊字符:
在 compareTo 方法中,它必须看起来像这样:
if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) >0)
return 1;
else if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) < 0)
return -1;
并且控制台中的输出是:
before sort :[10-$urya, 10-andy, 10-prince, 10-@rikesh]
after sort :[10-andy, 10-prince, 10-@rikesh, 10-$urya]
忽略 10,10 是我的 Person 对象中的年龄。
看看我的类,你就明白了。
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
public class ComaprableCheck {
public static void main(String[] args) {
ArrayList<Person> person = new ArrayList<Person>();
Person p = new Person();
p.age =10;
p.name ="$urya";
person.add(p);
p = new Person();
p.age =10;
p.name="andy";
person.add(p);
p = new Person();
p.age =10;
p.name ="prince";
person.add(p);
p = new Person();
p.age =10;
p.name ="@rikesh";
person.add(p);
System.out.println("before sort :"+person);
Collections.sort(person);
System.out.println("after sort :"+person);
}
}
public class Person implements Comparable<Person> {
public int age;
public String name;
@Override
public int compareTo(Person o) {
if(this.age > o.age)
return 1;
else if(this.age<o.age)
return -1;
else
{
if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) >0)
return 1;
else if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) < 0)
return -1;
}
return 0;
}
public String toString(){
return this.age+"-"+this.name;
}
}
下面的一段代码可以发挥作用。它在比较时忽略特殊字符,并相应地 returns 排序列表:
if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) >0) return 1; else if(this.name.replaceAll("[^a-zA-Z0-9]", "").compareTo(o.name.replaceAll("[^a-zA-Z0-9]", "")) < 0) return -1;
Java 8 蒸汽 API 1 班轮
list.stream().filter(s -> s.replaceAll("[^a-zA-Z0-9]", "")).sorted()