gpt4 book ai didi

Java 排列枚举数组

转载 作者:行者123 更新时间:2023-11-30 09:02:53 24 4
gpt4 key购买 nike

我想知道如何重新排序枚举,以便所有山羊都在数组的开头,所有绵羊都在数组的末尾。现在它确实可以解决问题,但直到数组大小 > 100.. 重新排序速度也很重要,因此 api 方法有点太慢了。有什么建议吗?

public class Sheep {


enum Animal {sheep, goat};

public static void main (String[] param) {

reorder(Animal.values());
}

public static void reorder (Animal[] animals) {


int l, r, i, j;

i = l = 0; //left most element
r = animals.length - 1;//right most element
int mid = (r+l)/2; // middle element of the array
for(i=0; i < animals.length;i++)
{
if(i < mid)
{
animals[i] = animals[l+1];

System.out.println(animals[r]);

} else if(i >= mid )
{
animals[i] = animals[r-1];
System.out.println(animals[r]);

}

}

}
}

最佳答案

由于 enum 实现了 Comparable,您可以简单地排序然后反转数组:

public static void reorder(Animal[] animals) {
Arrays.sort(animals);
for (int i = 0, j = animals.length - 1; i < j; ++i, --j) {
Animal tmp = animals[i];
animals[i] = animals[j];
animals[j] = tmp;
}
}

你也可以用:

List<Animal> list = Arrays.asList(animals);
Collections.sort(list);
Collections.reverse(list);

这基本上与 API 调用做同样的事情,只是将数组包装在 List 对象中(非常轻微)。你甚至可以这样做:

Arrays.sort(animals, Collections.reverseOrder());

(感谢 Bhesh Gurung 的想法。)

编辑:如果你必须处理恰好两个值,你可以通过简单地从两端扫描,当你发现两个乱序的元素时交换来做得更好:

public static void reorder(Animal[] animals) {
int first = 0;
int last = animals.length - 1;
while (first < last) {
/*
* The unsorted elements are in positions first..last (inclusive).
* Everything before first is the higher animal; everything after
* last is the lower animal.
*/
while (animals[first].ordinal() == 1 && first < last) {
++first;
}
while (animals[last].ordinal() == 0 && first < last) {
--last;
}
if (first < last) {
/*
* At this point, the sort conditions still hold and also we know
* that the animals at first and last are both out of order
*/
Animal temp = animals[first];
animals[first] = animals[last];
animals[last] = temp;
++first;
--last;
}
}
}

但是,如果您需要做的只是生成正确的输出(而不是实际对数组进行排序),那么@ajb 在评论中建议的方法是最好的:只需计算有多少只绵羊和山羊并打印出来相应的值多次。

关于Java 排列枚举数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25852541/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com