当前位置: 首页 > 面试题库 >

Java Rarrange枚举数组

单于旭东
2023-03-14
问题内容

我想知道如何重新排序枚举,以便所有山羊都在数组的开头而所有羊都在数组的结尾。现在,它实际上可以解决问题,但是要等到数组大小>
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]);

            }

        }

   }
}

问题答案:

由于是enumImplements 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提出的建议。)

编辑:如果您必须正好处理两个值,则可以通过简单地从两端进行扫描,在发现两个html" target="_blank">元素乱序时进行交换来做得更好:

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在注释中建议的方法是最好的:只需计算有多少只绵羊和山羊,然后打印相应的值即可很多次。



 类似资料:
  • 问题内容: 这不是卡住我的问题,而是我正在寻找一种编写代码的整洁方法。 本质上,我正在编写一个事件驱动的应用程序。用户触发一个事件,该事件被发送到适当的对象,然后这些对象处理事件。现在,我正在编写偶数处理程序方法,并且希望使用switch语句确定如何处理事件。现在,在我研究通用结构时,事件类非常简单: 然后,在另一堂课中,我会看到类似以下内容的内容: 我会 喜欢 做的就是这样的事情(尽管我当然会坚

  • 使用枚举我们可以定义一些带名字的常量。 使用枚举可以清晰地表达意图或创建一组有区别的用例。 TypeScript支持数字的和基于字符串的枚举。 数字枚举 首先我们看看数字枚举,如果你使用过其它编程语言应该会很熟悉。 enum Direction { Up = 1, Down, Left, Right } 如上,我们定义了一个数字枚举,Up使用初始化为1。 其余的成员

  • 枚举 枚举为一组相关值定义了一个通用类型,从而可以让你在代码中类型安全地操作这些值。 如果你熟悉 C ,那么你可能知道 C 中的枚举会给一组整数值分配相关的名称。Swift 中的枚举则更加灵活,并且不需给枚举中的每一个成员都提供值。如果一个值(所谓“原始”值)要被提供给每一个枚举成员,那么这个值可以是字符串、字符、任意的整数值,或者是浮点类型。 而且,枚举成员可以指定任意类型的值来与不同的成员值关

  • 本页内容包含: 枚举语法(Enumeration Syntax) 匹配枚举值与Swith语句(Matching Enumeration Values with a Switch Statement) 相关值(Associated Values) 原始值(Raw Values) 枚举定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。 如果你熟悉 C 语言,你就会知道

  • 枚举类型是在Solidity中的一种用户自定义类型。他可以显示的转换与整数进行转换,但不能进行隐式转换。显示的转换会在运行时检查数值范围,如果不匹配,将会引起异常。枚举类型应至少有一名成员。我们来看看下面的例子吧。 pragma solidity ^0.4.0; contract test { enum ActionChoices { GoLeft, GoRight, GoStraight

  • 由于第一章节是我翻译的,而且与他的版本不一致,导致第一章节有枚举这部分,而他的第二章节也有这部分,但内容不同,所以我保留了这部分。 枚举 使用枚举我们可以定义一些有名字的数字常量。 枚举通过使用enum关键字定义。 enum Direction { Up = 1, Down, Left, Right } 一个枚举类型可以包含零个或多个枚举成员。 枚举成员具有一个数字