我有一个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
按字母顺序排列的两个例外,也按字母顺序跟随数组的其余部分。
答案 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 :(得分: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
。