【问题标题】:How to sort without considering special characters in java?java中如何在不考虑特殊字符的情况下进行排序?
【发布时间】:2023-03-18 21:41:01
【问题描述】:

我想对名字列表进行排序,我使用了 compareTo 方法,我的列表中有这样的名字

$urya, 安迪, 王子, @rikesh,

预期输出: 安迪, 王子, $urya, @rikesh,

相反,我得到: $urya @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);
}

【问题讨论】:

  • 如果您想忽略特殊字符,$urya 将如何超越@rikesh,它必须反过来对吗?如果我错了,请纠正我。

标签: java sorting compareto


【解决方案1】:

Java 8 steam API 一班

list.stream().filter(s -> s.replaceAll("[^a-zA-Z0-9]", "")).sorted()

【讨论】:

  • 也许使用\p{Punct} 明确过滤掉标点符号。 source
  • 是的,可以添加
【解决方案2】:

我认为您希望 $ 被视为 S。在这种情况下,在 compareTo 方法中,您必须将 $ 替换为 S(其他类似)并进行比较。

如果您不想考虑$ 本身(如问题所述),则必须将特殊字符替换为空字符。

【讨论】:

  • 以特殊字符开头的名字应该在排序列表中被推到最后,而现在以特殊字符开头的名字在最前面,然后是排序列表!
  • 这是因为特殊字符在 ASCII 图表中出现在字母之前。您必须分别对它们进行排序并附加它们。即,分别对以字母开头的名称和以特殊字符开头的名称进行排序并附加。
【解决方案3】:

我做了一些修改,根据您的关注,我忽略了特殊字符:

在 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;
    }

}

下面的代码可以发挥作用。它只是在比较时忽略特殊字符并相应地返回排序列表:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    • 2022-06-16
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多