【问题标题】:How to sort strings such that values with extra information appear first?如何对字符串进行排序,以使带有额外信息的值首先出现?
【发布时间】:2014-07-15 19:54:44
【问题描述】:

我正在尝试对以下字符串进行排序

1.0.0.0-00000000-00000
2.1.0.0
2.2.0.0
2.3.0.0-00000000-00000

我目前将这些值保存在一个字符串数组中。

 String[] arrays = {"1.0.0.0-00000000-00000", "2.1.0.0", "2.2.0.0", "2.3.0.0-00000000-00000"};

我试图有一个输出,如果没有“-”,那么这些值会按排序顺序到达我的数组的末尾。我正在尝试输出如下:

1.0.0.0-00000000-00000
2.3.0.0-00000000-00000
2.1.0.0
2.2.0.0

我已经尝试过Arrays.sort(arrays),但我不确定如何进行排序?

import java.util.Arrays;
import java.util.Comparator;
import java.util.Collections;

public class HelloWorld{

     public static void main(String []args){

       String[] arrays = {"1.0.0.0-00000000-00000", "2.1.0.0", "2.2.0.0", "2.3.0.0-00000000-00000"};
       String[] newArray = new String[arrays.length];

    class CustomComparator implements Comparator<String>
    {
        @Override
        public int compare(String a, String b)
        {
            if(a.contains("-") && !b.contains("-"))
                 return 1;
            else if(!a.contains("-") && b.contains("-"))
                 return -1;
            return a.compareTo(b);
        }
    }

    Arrays.sort(arrays, new CustomComparator());

       for(String array : arrays)
       {
            System.out.println(array);
       }

     }
}


Error:

$javac HelloWorld.java 2>&1

HelloWorld.java:25: error: no suitable method found for sort(String[],CustomComparator)
    Collections.sort(arrays, new CustomComparator());
               ^
    method Collections.<T#1>sort(List<T#1>,Comparator<? super T#1>) is not applicable
      (no instance(s) of type variable(s) T#1 exist so that argument type String[] conforms to formal parameter type List<T#1>)
    method Collections.<T#2>sort(List<T#2>) is not applicable
      (cannot instantiate from arguments because actual and formal argument lists differ in length)
  where T#1,T#2 are type-variables:
    T#1 extends Object declared in method <T#1>sort(List<T#1>,Comparator<? super T#1>)
    T#2 extends Comparable<? super T#2> declared in method <T#2>sort(List<T#2>)
1 error



    The method gave me an output of 
2.1.0.0 
2.2.0.0
1.0.0.0-00000000-00000 
2.3.0.0-00000000-00000 

as opposed to

1.0.0.0-00000000-00000
2.3.0.0-00000000-00000
2.1.0.0 
2.2.0.0 

【问题讨论】:

  • 尝试使用string.contains("-")
  • 您可以编写自定义比较 - 但这与排序算法没有任何关系(排序算法只需要一个相对排序函数)。请参阅docs.oracle.com/javase/7/docs/api/java/util/…(或数组的等效项)
  • 您需要自定义ComparatorArrays.sort 有一个重载,它接受一个作为参数。
  • 还要注意Arrays.sort 的一些重载是稳定的,所以如果创建一个给出正确顺序的Comparator 似乎很难,使用稳定排序进行两次排序可能更容易(就像你可以首先按名字排序人员表,然后按姓氏,以获得正确的姓名顺序)。
  • 对数组使用 Arrays.sort

标签: java arrays sorting


【解决方案1】:

使用比较器

    import java.util.Comparator;
    class CustomComparator implements Comparator<String> {
        @Override
        public int compare(String a, String b) {
            if(a.contains("-") && !b.contains("-"))
                 return 1;
            else if(!a.contains("-") && b.contains("-"))
                 return -1;
            return a.compareTo(b);
        }
    }
    Collections.sort(arrays, new CustomComparator());

返回负值表示b在a之前,正值表示a在b之前

【讨论】:

  • 我试过你说的但我得到一个编译错误:这是我的代码:
  • public static void main(String []args){ String[] arrays = {"1.0.0.0-00000000-00000", "2.1.0.0", "2.2.0.0", "2.3. 0.0-00000000-00000"};类 CustomComparator 实现 Comparator { @Override public int compare(String a, String b) { if(a.contains("-") && !b.contains("-")) return 1;否则 if(!a.contains("-") && b.contains("-")) return -1;返回 a.compareTo(b); } } Collections.sort(arrays, new CustomComparator()); } }
  • 只是猜测,您是否导入了 Comparator?
  • 正如我所说,请将您尝试的代码粘贴到您的原始问题中,作为评论是不可读的。
  • @user3767481 如果要对数组进行排序,则不要使用Collections.sort,而是使用Arrays.sortCollections 处理集合,例如 Lists、Sets。
【解决方案2】:

较小的值先于较大的值。如下更改您的Comparator

class CustomComparator implements Comparator<String>
{
    @Override
    public int compare(String a, String b)
    {
        if(a.contains("-") && !b.contains("-"))
             return -1;
        else if(!a.contains("-") && b.contains("-"))
             return 1;
        return a.compareTo(b);
    }
}

【讨论】:

    【解决方案3】:
     int dashed = 0;    
    //How many strings with a "-" are there?    
    for (String s : arrays)    
        if ( s.contains("-") )    
            ++dashed;    
    
    int undashed = arrays.length - dashed;
    dashed = 0;
    Arrays.sort(arrays);    
    
    for (String s : arrays)    
         if ( s.contains("-") )    
            newArray[dashed++] = s;    
        else    
            newArray[undashed++] = s;  
    

    它很简单,无论数组、字符串或额外信息的大小如何,它都可以工作。只需为 Arrays.sort 导入 java.util.Arrays。如果可以做到简单,就没有理由做不必要的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 2021-09-21
      • 2019-10-13
      相关资源
      最近更新 更多