2014-09-13 1 views
1

довольно новичок вопрос Я думаю, но я провел более 6 часов, делая это в одну сторону, а другой, и я не знаю, как лучше всего сделать это, поэтому я прошу вас о помощи в том, как это сделать suppost.Список перечислений: У меня есть 2 перечисления, и я должен составить список/массив

У меня есть 2 перечисления, например, автомобиль и велосипед. Я должен сделать list или array (я не знаю, что лучше), у которого есть 2 - 1 000 000 элементов внутри, и когда это делается, я должен изменить порядок list/array (велосипеды в начале и автомобили в конце). Есть только велосипед и автомобиль, но могут быть сотни или thoulsands или даже больше из них. Я не знаю, можно ли сделать EnumMap около 2 перечислений.

EnumMap имеет ключ и значение, поэтому я дал ключевой «автомобиль» и значение «0», а ключевое значение «байк» «1», поэтому было бы легче переупорядочить, но я узнал, что не могу сделать это на EnumMap, потому что не имеет значения, сколько элементов я добавляю, всегда есть только 2, велосипед и автомобиль. Я не могу говорить о сотнях.

Причина, почему я не сосредоточен на массиве, в начале коды есть enum garage {bike, car};

Это домашнее задание, да, но я просто надеюсь, чтобы выяснить способ сделать это (потраченный часы только чтение и пробовать разные подходы), а не то, что кто-то делает это для меня.

+0

Используйте список, если вы не знаете, сколько элементов вам нужно. Если вы используете 'ArrayList', это в конечном итоге поддерживается массивом. –

+3

Я боюсь, что вы можете не понимать свое задание. Мое предложение состоит в том, что вы размещаете текст заданий здесь дословно, чтобы мы могли убедиться, что вы правильно интерпретируете вещи, а если нет, чтобы мы могли объяснить, что вам нужно делать. Я предполагаю, что вам нужно создать класс, который * содержит * поле enum, и что вам нужно создать коллекцию объектов этого класса, но это всего лишь SWAG. –

+0

EnumMap, вероятно, не подходит. Вместо этого рассмотрите использование [компаратора] (http: // docs.oracle.com/javase/7/docs/api/java/util/Comparator.html) с помощью ['Collections.sort (List, Comparator)'] (http://docs.oracle.com/javase/7/docs/ api/java/util/Collections.html # sort% 28java.util.List,% 20java.util.Comparator% 29) – hexafraction

ответ

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). Как отмечается в Википедии статью,

Поскольку подсчет вид использует ключевые значения, как индексы в массиве, это не сравнение сортируют, а Ω (п § п) нижняя граница для сортировки сравнения не относится к нему.

+0

Я тоже играю с этим, спасибо за ваше время! – lion

+0

Сфокусировался на этом подходе, и он сделал трюк. Большое спасибо! – lion

0
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; 
    } 
} 
+0

wow, этот 'for (Animal oneAnimal: animals) ...' сделал так много смысла прямо сейчас. – lion

1

Хорошо, на основе того, что я понимаю. Вы должны иметь ListAnimals и реализовать метод public static void reorder(ArrayList<Animal> 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 :)

+0

Я буду играть с ним, спасибо за ваше время! – lion

+0

Вам не нужно добавлять поле 'order', потому что перечисления уже сопоставимы сами по себе, и они сравнивают свой * натуральный * порядок (порядок, в котором определены константы):' public abstract class Enum > инвентарь Сопоставимый , Serializable' <- см. Раздел 'Comparable '. –

+0

@ErwinBolwidt, извините, моя ошибка. Уже исправлено. Спасибо. Я просто думал, может быть, он будет объявлять константы перечисления неупорядоченным способом. В своем примере он имеет это «enum Animal {sheep, goat};' – lxcky

Смежные вопросы