在Java中使用RuleBasedCollat​​or设置排序规则时遇到困难

时间:2019-01-19 04:45:48

标签: java sorting selenium-webdriver

我正在尝试在以下位置执行自动化操作:

  1. 从网页中获取已经升序的字符串值列表。

  2. 我想确保网页给定值的升序正确与否。

  3. 所以我将值存储在从网页收集的数组中。

  4. 从网页上收集值之后,我正在对该数组进行排序,但是有些使用Java代码排序后如何看不到升序的相同值。

这些是我从网站上获得的价值:

_john
_tim
11
111
5
A
aaa
aaa
AI-1
Android
API
AppName
asd
AWS
AWS
awstest
AWSTest1type
Azure

使用Java集合进行排序后,我将变得如下所示:

 _john
    _tim
    11
    111
    5
    A
   AI-1
   API
   AWS
   AWS
  Android
  AppName
  Azure
  aaa
  aaa

我正在使用的代码进行排序:

String rules = "< '_' < 1 < 2 <3 <4 < 5 < A < a";
        Collections.sort(myStringArray, new RuleBasedCollator(rules));

我可以错过上述规则中的任何内容吗?

1 个答案:

答案 0 :(得分:1)

这是由于ASCII字符集的顺序,其中“ Z”排在“ a”之后


RuleBasedCollat​​or仅检查要排序的字符串的第一个字母。如您所设定的规则是(A

由于您的列表包含以特殊字符开头的字符串,因此我建议创建两个要排序的列表。一个用于以特殊字符开头的字符串,然后是包含所有其他值的其他列表。分别对这两个列表进行排序,然后合并排序后的列表。我已经尝试了下面的代码,并且效果很好

// Input list
List<String> name = new ArrayList<String>();


    final String[] specialChars = { "_", ">" }; 
    List<String> specCharList = new ArrayList<String>();
    List<String> strList = new ArrayList<String>();
    List<String> finalList = new ArrayList<String>();
    String rules = "< '_' < '>' ";

    boolean isSpec = false ;
    for(String names : name) {
        isSpec = false ;
        for(int i=0;i<specialChars.length;i++) {
            if(names.startsWith(specialChars[i])) {
                // System.out.println("Name : "+names);
                isSpec = true ;
            }
        }  
      // to sort special char list and normal list
       if(isSpec) {
           specCharList.add(names);
       } else {
           strList.add(names);
       }
    }


    try {
        // To sort special character list
        Collections.sort(specCharList, new RuleBasedCollator(rules));
        // Add the sorted list to finallist
        finalList.addAll(specCharList);

        // to sort other list
        Collections.sort(strList, String.CASE_INSENSITIVE_ORDER);
        // Add the sorted list to finallist
        finalList.addAll(strList);

    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("Final Output List --------");
    for(String names : finalList) {
        System.out.println(names);
    }