[英]How to sort array of times with AM and PM at the end in descending order in Java
[英]Java How to sort an array of signed integers in descending order ignoring the signs?
標題是不言自明的。 例如
[2, 1, 0, -2, -5]
會變成
[-5, -2, 2, 1, 0]
我的策略是先按升序排序,然后按負數和正數分別對它們進行排序,但我的策略是模糊的。 我知道這很模糊,但你的答案對我很有幫助。
簡潔版本 :
Integer[] ary = { 2, 1, 0, -2, -5 };
Arrays.sort(ary, (Integer i1, Integer i2) -> Math.abs(i2) - Math.abs(i1));
System.out.println(Arrays.toString(ary));
不需要ArrayList。 但是需要整數而不是int。
我的第一個答案是:
我首先從int []轉換為List <Integer>,然后使用Lambda比較器按照您想要的方式對其進行排序。
int[] ary = { 2, 1, 0, -2, -5 };
List<Integer> intList = new ArrayList<Integer>();
for (int index = 0; index < ary.length; index++) {
intList.add(ary[index]);
}
intList.sort((Integer i1, Integer i2) -> Math.abs(i2) - Math.abs(i1));
System.out.println(intList);
它返回
[-5, 2, -2, 1, 0]
如果你真的需要一個int[]
這有點亂。
您可以定義一個Comparator,但由於Generics不能使用原語,因此它不適用於int[]
。
Comparator<Integer> integerComparator = (x, y) -> Integer.compare(Math.abs(x), Math.abs(y));
使用List<Integer>
和Integer[]
更容易:
List<Integer> integerList = Arrays.asList(2, 1, 0, -2, -5);
Integer[] integerArray = new Integer[] {2, 1, 0, -2, -5};
integerList.sort(integerComparator.reversed());
Arrays.sort(integerArray,integerComparator.reversed());
System.out.println("ints = " + integerList);
System.out.println("integerArray = " + Arrays.toString(integerArray));
使用int[]
,它更加混亂。 您可以使用IntStream
並使用boxed()
將其IntStream
Stream<Integer>
。 但是,你會受到性能影響,但除非你正在處理大型數組或在應用程序的關鍵部分使用它,否則它不會成為問題。
int[]primitiveArray = new int[]{2, 1, 0, -2, -5};
int[] ints = IntStream.of(primitiveArray)
.boxed()
.sorted(integerComparator.reversed())
.mapToInt(Integer::valueOf)
.toArray();
System.out.println("ints = " + Arrays.toString(ints));
只需對輸入comparing(Math::abs, reverseOrder())
排序comparing(Math::abs, reverseOrder())
:
@Test
public void test() {
List<Integer> input = asList(2, 1, 0, -2, -5);
List<Integer> output = input.stream()
.sorted(comparing(Math::abs, reverseOrder()))
.collect(toList());
System.out.println(output);
}
輸出
[-5, 2, -2, 1, 0]
需要進口:
import org.junit.Test;
import java.util.List;
import static java.util.Arrays.asList;
import static java.util.Comparator.comparing;
import static java.util.Comparator.reverseOrder;
import static java.util.stream.Collectors.toList;
這是一個過度面向對象的解決方案,不需要內存將數組復制到List,不需要將List解包回數組,也不需要重新發明任何排序算法:
final int[] array = new int[] {2, 1, 0, -2, -5};
Collections.sort(
new AbstractList<Integer>() {
public Integer get(int index) {
return array[index];
}
public int size() {
return array.length;
}
@Override
public Integer set(int index, Integer element) {
int old = array[index];
array[index] = element;
return old;
}
},
new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return Math.abs(o1) - Math.abs(o2);
}
}
);
如果你有Commons Lang,它會更清潔:
final int[] array = new int[] {2, 1, 0, -2, -5};
Collections.sort(
ArrayUtils.toObject(array),
new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return Math.abs(o1) - Math.abs(o2);
}
}
);
來自另一個答案的比較器((Integer i1, Integer i2) -> Math.abs(i2) - Math.abs(i1))
,如果是這里的那個就是lambda版本。 如果你有Java 8+,請隨意使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.