在Java中使用两个异常对数组进行排序

时间:2017-03-10 17:58:17

标签: java arrays sorting

我有一个array strings我需要在归还之前对其进行排序。问题是这些价值中的两个必须首先出现。我尝试了一些事情(包括下面的内容),但我似乎无法弄明白。

我在下面的内容显然不起作用,因为在某些情况下我将它排序两次。我知道我可以将array更改为list,然后使用Collections.reverse,但有没有更好的方式不涉及更改结构?我在下面添加了一个简单的例子

  public static String[] getStrings() {
        String[] array = {"d","a","c","e","b"};
        boolean first = false;
        boolean second = false;
        int left = 0;
        for (int right = 0; right < array.length; right++) {
            if (array[right].equals("e")){
                  first = true;
                  array[right] = array[left];
                  array[left] = "e";
                  left++;
            }
        }
        if (first) {Arrays.sort(array, left, array.length);}
        left = 0;
        for (int right = 0; right < array.length; right++) {
            if (array[second].equals("c")){
                  second = true;
                  array[right] = array[left];
                  array[left] = "c";
                  left++;
            }
        }
        if (second) {Arrays.sort(array, left, array.length);}
        if (!first && !second) {Arrays.sort(array);}
      }
    return array;
  }

修改

使用示例array中的d,a,c,e,b。排序后应该是c,e,a,b,d

按字母顺序排列的两个例外,也按字母顺序跟随数组的其余部分。

5 个答案:

答案 0 :(得分:2)

如何实施自定义Comparator

String[] array = {"d","a","c","e","b"};
Arrays.sort(array, new Comparator<String> () {
    int compare(String s1, String s2) {
        if (firstOne.equals(s1) && firstOne.equals(s2)) {
           return 0;
        } else if (firstOne.equals(s1) {
           return -1;
        } else if (firstOne.equals(s2)) {
           return 1;
        }

        if (secondOne.equals(s1) && secondOne.equals(s2)) {
           return 0;
        } else if (secondOne.equals(s1) {
           return -1;
        } else if (secondOne.equals(s2)) {
           return 1;
        }

        return s1.compareTo(s2);
    });

参阅

  1. https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html

  2. https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#sort(T[],%20java.util.Comparator)

答案 1 :(得分:1)

您可以使用Java 8 Stream API。

final String[] array = {"d","a","c","e","b"};
final Set<String> search = Stream.of("c", "e").collect(toSet());
final String[] result = Stream.concat(
    Stream.of(array).filter(search::contains).sorted(),
    Stream.of(array).filter(s -> !search.contains(s)).sorted()
).toArray(String[]::new);

第一部分选择“c”和“e”字符串并单独对它们进行排序,然后选择任何不是“c”或“e”的字符串并单独排序。最后,将两个流连接成一个数组。

答案 2 :(得分:0)

获取您不想排序的元素的索引,并将这些元素移到列表的前面,然后对列表的其余部分进行排序。

public static String[] getString(String[] strArray, int... firstElems) {
    // Move the elements that are not sorted to the front
    int g = 0;
    for (int f = 0; f < firstElems.length; f++, g++) {
        String elem = strArray[g];
        strArray[g] = strArray[firstElems[f]];
        strArray[firstElems[f]] = elem;
    }

    // Sort the rest
    Arrays.sort(strArray, g, strArray.length);
    return strArray;
}

答案 3 :(得分:0)

基于@ ikicha和Java 8的简短解决方案:

final String first = "c", second = "e";
Arrays.sort(array, (i, j) -> {
    if (i.equals(first) || (i.equals(second) && !j.equals(first))) {
        return -1;
    } else {
        return i.compareTo(j);
    }
});

答案 4 :(得分:-1)

为什么不先排序,然后查找这两个值,然后提前转换它们? 最坏的情况是n*log(n)+2n