【问题标题】:List of enums: I have 2 enums and I have to make a list/array枚举列表:我有 2 个枚举,我必须创建一个列表/数组
【发布时间】:2014-09-13 00:36:44
【问题描述】:

我认为这是一个相当新手的问题,但我已经花了 6 个多小时以一种又一种的方式做这件事,我不知道最好的方法是什么,所以我想请你帮忙看看应该如何做.

我有 2 个枚举,例如汽车和自行车。我必须制作 listarray (我不知道哪个更好),里面有 2 - 1 000 000 个元素,完成后我必须重新排序 list/array (自行车在开始和最后的汽车)。只有一辆自行车和一辆汽车,但可能有数百或数千甚至更多。我不知道是否可以让EnumMap 大约 2 个枚举。

EnumMap 有 key 和 value,所以我给 key "car" 和 value "0", key "bike" value "1",所以重新排序会更容易,但我发现我不能在EnumMap 上执行此操作,因为无论我添加多少元素,总是只有 2 个,自行车和汽车。我认为不能谈论数百个。

之所以没有关注数组,是因为代码开头有enum garage {bike, car};

这是家庭作业,是的,但我只是希望找出方法(花了几个小时阅读和尝试不同的方法),而不是有人为我做。

【问题讨论】:

  • 如果您不知道需要多少元素,请使用列表。如果您使用ArrayList,它最终还是由数组支持。
  • 我担心你可能误解了你的任务。我的建议是您在此处逐字发布实际的作业文本,以便我们确保您正确解释事物,如果不正确,我们可以解释您需要做什么。我的猜测是,您需要创建一个 包含 枚举字段的类,并且您需要创建此类对象的集合,但这只是一个 SWAG。
  • 一个 EnumMap 可能不是要走的路。相反,请考虑使用 comparatorCollections.sort(List, Comparator)
  • 我发布了正确的,但我不会让它太长,我只是想找出我需要做什么:P
  • 好的,数组,所以我需要这样做

标签: java arrays arraylist enums enum-map


【解决方案1】:

我建议你把逻辑拆分成两个方法,第一个countGoats(Animal[])-

private static int countGoats(Animal[] animals) {
    int count = 0;
    for (Animal a : animals) {
        if (Animal.goat == a) {
            count++;
        }
    }
    return count;
}

由于直到 goats 计数的每个元素都应该是数组中的 goat(以及 sheep 之后的每个元素),因此我们可以使用类似的东西迭代数组,

public static void reorder(Animal[] animals) {
    if (animals == null) {
        return;
    }
    int goats = countGoats(animals);
    for (int i = 0; i < animals.length; i++) {
        // if (i < goats) - it's a goat, otherwise it's a sheep.
        animals[i] = (i < goats) ? Animal.goat : Animal.sheep;
    }
}

这是Counting sort 的示例,运行时复杂度为 O(n)。正如维基百科文章指出的那样,

因为计数排序使用键值作为数组的索引,所以它不是比较排序,比较排序的Ω(n log n)下限不适用于它。

【讨论】:

  • 更专注于这种方法,它成功了。非常感谢!
【解决方案2】:

好的,根据我的理解。您需要拥有AnimalsList,并实现一个方法public static void reorder(ArrayList&lt;Animal&gt; animals) 来重新排序此列表。

这就是我想出的:

public class EnumHw {

    public static void main(String[] args) {
        ArrayList<Animal> animalList = new ArrayList<Animal>();

        animalList.add(Animal.GOAT);
        animalList.add(Animal.SHEEP);
        animalList.add(Animal.GOAT);
        animalList.add(Animal.SHEEP);

        EnumHw.reorder(animalList);

        for (Animal animal : animalList) {
            System.out.println(animal);
        }
    }

    public static void reorder(ArrayList<Animal> animals) {        
        Collections.sort(animals);        
    }
}

enum Animal {
    //Order you enum in the way you want them to come first in the List
    GOAT,
    SHEEP;    
}

希望它对您有所帮助(并且您可以使用Collections API。:)

【讨论】:

  • 您不需要添加order 字段,因为枚举本身已经可以比较,并且它们按照它们的自然顺序进行比较(常量的顺序)已定义):public abstract class Enum&lt;E extends Enum&lt;E&gt;&gt; implements Comparable&lt;E&gt;, Serializable Comparable<E> 部分。
  • @ErwinBolwidt,对不起,我的错误。已经修好了。谢谢你。我只是在想也许他会以无序的方式声明他的枚举常量。在他给出的例子中,他有这个enum Animal {sheep, goat};
  • @J.Lucky 我现在完全理解了这一点,但不幸的是我需要多做一些工作:P 感谢您解释您的方法。
  • @J.Lucky 这很有帮助,但我不能用你的方法做到这一点。我在下面发布了关于它必须如何的新帖子(至少我是这么认为的)。
【解决方案3】:
public void reorder(Animal[] animals) {
    int sheepCount = 0; 
    int goatCount = 0;
    for (Animal oneAnimal : animals) {
        if (oneAnimal == Animal.sheep) {
            sheepCount++;
        } else {
            goatCount++;
        }
    }
    for (int i = 0; i < sheepCount; i++) {
        animals[i] = Animal.sheep;
    }
    for (int i = 0; i < goatCount; i++) {
        animals[i + sheepCount] = Animal.goat;
    }
}  

【讨论】:

  • 哇,这个for (Animal oneAnimal : animals)... 现在非常有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-25
  • 2015-07-07
相关资源
最近更新 更多