Java:如何避免在使用Collator进行排序时忽略连字符

Java:如何避免在使用Collator进行排序时忽略连字符,java,ignore,hyphen,Java,Ignore,Hyphen,这个问题涉及到 我对以下代码有类似的问题 public void orderList() { String str1 = "test-2014"; String str2 = "test195519-9022c72bc161"; String str3 = "test200101-ee4d99b1492c"; String str4 = "test212941-884e3f03fe1e"; List<String> list = Lists.n

这个问题涉及到

我对以下代码有类似的问题

public void orderList() {
    String str1 = "test-2014";
    String str2 = "test195519-9022c72bc161";
    String str3 = "test200101-ee4d99b1492c";
    String str4 = "test212941-884e3f03fe1e";
    List<String> list = Lists.newArrayList();

    list.add(str3);
    list.add(str2);
    list.add(str1);
    list.add(str4);

    System.out.println("List before ordering = " + list);

    Collator collator = Collator.getInstance();
    Collections.sort(list, collator);

    System.out.println("List after ordering = " + list);
}
------------- OUTPUT ----------------------------
List before ordering = [test200101-ee4d99b1492c, test195519-9022c72bc161, test-2014, test212941-884e3f03fe1e]
List after ordering = [test195519-9022c72bc161, test200101-ee4d99b1492c, test-2014, test212941-884e3f03fe1e]
根据上述问题中的建议,我必须在单引号中加上连字符。 问题是,用于排序的列表通常来自其他方法。
有没有办法通过在连字符附近添加单引号或重写compare()方法,将Collator配置为在不编辑列表的情况下获得所需的输出

您必须编写自己的compare()或compareTo()方法。默认情况下,Collections.sort()使用
自然顺序对集合进行排序,连字符的
ASCII值为45,0的值为48。。我不知道你为什么得到那个订单。你应该得到你期待的订单

例如:

public static void main(String[] args) {
    ArrayList<String> l = new ArrayList<String>();
    l.add("test123");
    l.add("test-100");
    l.add("test567");
    System.out.println(l);
    Collections.sort(l);
    System.out.println(l);

}

O/P : 
[test123, test-100, test567]
[test-100, test123, test567]
publicstaticvoidmain(字符串[]args){
ArrayList l=新的ArrayList();
l、 添加(“test123”);
l、 添加(“测试-100”);
l、 添加(“test567”);
系统输出打印LN(l);
集合。排序(l);
系统输出打印LN(l);
}
O/P:
[test123、test-100、test567]
[测试-100、测试123、测试567]

试试这个,这是根据您的需要工作的,在这段代码中我没有在单引号之间使用连字符('-')

public void orderList() {
    String str1 = "test-2014";
    String str2 = "test195519-9022c72bc161";
    String str3 = "test200101-ee4d99b1492c";
    String str4 = "test212941-884e3f03fe1e";
    //List<String> list = List.newArrayList();
ArrayList<String> list = new ArrayList<String>();
    list.add(str3);
    list.add(str2);
    list.add(str1);
    list.add(str4);

    System.out.println("List before ordering = " + list);
Collections.sort(list);
    System.out.println("List after ordering = " + list);
}
您的代码:

Collator collator = Collator.getInstance();
Collections.sort(list, collator);
在这段代码中,您得到了一个,但我们不知道排序规则是什么,因为我们不知道您的JVM

考虑以下代码:

import java.text.*;
import java.util.*;

public class Order {
  public static void main(String[] args) throws ParseException {
    List<String> list = Arrays.asList("a", "A", "\u00E6", "z", "Z", "1", "-");

    Collections.sort(list);
    print("Natural", list);

    Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
    print("Case insensitive", list);

    Collator norwegian = Collator.getInstance(new Locale("nb_NO"));
    norwegian.setStrength(Collator.PRIMARY);
    Collections.sort(list, norwegian);
    print("Localized natural language rules (Norwegian)", list);

    Collator custom = new RuleBasedCollator("< a< A< z< Z< '-'< 1");
    Collections.sort(list, custom);
    print("Custom", list);
  }

  private static void print(String what, Object value) {
    System.out.println(what);
    System.out.println(value);
  }
}

另一个问题的答案是讨论如何避开连字符。

从您的示例中,我看不出为什么“test-2014”是较小的一个。您想要什么样的比较?您还没有正确初始化列表,非常感谢。集合。排序(列表)工作正常。即使使用List=List.newArrayList();我只是想进一步了解collator的工作原理。Collections.sort()的工作原理。我之所以得到我提到的订单,是因为Collator工作方式的特殊性。
Collator collator = Collator.getInstance();
Collections.sort(list, collator);
import java.text.*;
import java.util.*;

public class Order {
  public static void main(String[] args) throws ParseException {
    List<String> list = Arrays.asList("a", "A", "\u00E6", "z", "Z", "1", "-");

    Collections.sort(list);
    print("Natural", list);

    Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
    print("Case insensitive", list);

    Collator norwegian = Collator.getInstance(new Locale("nb_NO"));
    norwegian.setStrength(Collator.PRIMARY);
    Collections.sort(list, norwegian);
    print("Localized natural language rules (Norwegian)", list);

    Collator custom = new RuleBasedCollator("< a< A< z< Z< '-'< 1");
    Collections.sort(list, custom);
    print("Custom", list);
  }

  private static void print(String what, Object value) {
    System.out.println(what);
    System.out.println(value);
  }
}
Natural
[-, 1, A, Z, a, z, æ]
Case insensitive
[-, 1, A, a, Z, z, æ]
Localized natural language rules (Norwegian)
[-, 1, A, a, æ, Z, z]
Custom
[a, A, z, Z, -, 1, æ]