Java Enum определение

Вам нужно array_multisort

$mylist = array(
    array('ID' => 1, 'title' => 'Boring Meeting', 'event_type' => 'meeting'),
    array('ID' => 2, 'title' => 'Find My Stapler', 'event_type' => 'meeting'),
    array('ID' => 3, 'title' => 'Mario Party', 'event_type' => 'party'),
    array('ID' => 4, 'title' => 'Duct Tape Party', 'event_type' => 'party')
);

# get a list of sort columns and their data to pass to array_multisort
$sort = array();
foreach($mylist as $k=>$v) {
    $sort['title'][$k] = $v['title'];
    $sort['event_type'][$k] = $v['event_type'];
}
# sort by event_type desc and then title asc
array_multisort($sort['event_type'], SORT_DESC, $sort['title'], SORT_ASC,$mylist);

Начиная с PHP 5.5.0:

array_multisort(array_column($mylist, 'event_type'), SORT_DESC,
                array_column($mylist, 'title'),      SORT_ASC,
                $mylist);

$mylist теперь:

array (
  0 => 
  array (
    'ID' => 4,
    'title' => 'Duct Tape Party',
    'event_type' => 'party',
  ),
  1 => 
  array (
    'ID' => 3,
    'title' => 'Mario Party',
    'event_type' => 'party',
  ),
  2 => 
  array (
    'ID' => 1,
    'title' => 'Boring Meeting',
    'event_type' => 'meeting',
  ),
  3 => 
  array (
    'ID' => 2,
    'title' => 'Find My Stapler',
    'event_type' => 'meeting',
  ),
)

144
задан CajunLuke 30 August 2012 в 19:07
поделиться

4 ответа

Это означает, что аргумент типа для перечисления должен произойти из перечисления, которое самого имеет тот же аргумент типа. Как это может произойти? Путем создания аргумента типа самим новым типом. Таким образом, если бы у меня есть перечисление под названием StatusCode, это было бы эквивалентно:

public class StatusCode extends Enum<StatusCode>

Теперь, если Вы проверяете ограничения, мы имеем Enum<StatusCode> - так E=StatusCode. Давайте проверим: E расширяется Enum<StatusCode>? Да! Мы хорошо.

можно спрашивать себя, какова точка этого:) Ну, это означает, что API для Перечисления может относиться к себе - например, способность сказать это Enum<E> реализации Comparable<E>. Базовый класс в состоянии сделать сравнения (в случае перечислений), но он может удостовериться, что только сравнивает правильный вид перечислений друг с другом. (РЕДАКТИРОВАНИЕ: Ну, почти - посмотрите редактирование в нижней части.)

я использовал что-то подобное в своем порте C# ProtocolBuffers. Существуют (неизменные) "сообщения" и "разработчики" (изменяемы, используются для создания сообщения) - и они стали парами типов. Включенные интерфейсы:

public interface IBuilder<TMessage, TBuilder>
  where TMessage : IMessage<TMessage, TBuilder> 
  where TBuilder : IBuilder<TMessage, TBuilder>

public interface IMessage<TMessage, TBuilder>
  where TMessage : IMessage<TMessage, TBuilder> 
  where TBuilder : IBuilder<TMessage, TBuilder>

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

РЕДАКТИРОВАНИЕ: Обратите внимание, что это не мешает Вам создать нечетные типы, которые используют аргумент типа, который сам является хорошо, но который не является тем же типом. Цель состоит в том, чтобы принести пользу в право случай, а не защитить Вас от неправильный случай.

Поэтому, если Enum не были обработаны "особенно" в Java так или иначе, Вы могли (как отмечено в комментариях), создают следующие типы:

public class First extends Enum<First> {}
public class Second extends Enum<First> {}

Second реализовал бы Comparable<First>, а не Comparable<Second>..., но First самостоятельно будет прекрасен.

103
ответ дан Jon Skeet 30 August 2012 в 19:07
поделиться

Вы не единственный, задающийся вопросом, что это означает; см. Хаотический блог .

Java “If, класс расширяет этот класс, это должно передать параметр E. Границы E’s параметра для класса, который расширяет этот класс с помощью того же параметра E”.

2
ответ дан kpirkkal 30 August 2012 в 19:07
поделиться
  • 1
    Суммируйте содержание ссылки; просто регистрация ссылки не полезна. – LittleBobbyTables 28 November 2012 в 16:44

Ниже приводится модифицированная версия объяснения из книги Обобщения и коллекции Java : У нас есть Enum , объявленный

enum Season { WINTER, SPRING, SUMMER, FALL }

, который будет расширен до класса

final class Season extends ...

, где ... должен быть каким-то параметризованным базовым классом для Enums. Давайте работать что это должно быть. Ну, одно из требований для Season заключается в том, что он должен реализовывать Comparable . Итак, нам понадобится

Season extends ... implements Comparable<Season>

Что бы вы могли использовать для ... что позволило бы это работать? Учитывая, что это должна быть параметризация Enum , единственным выбором является Enum , так что вы можете иметь:

Season extends Enum<Season>
Enum<Season> implements Comparable<Season>

Итак Enum параметризован по типам, таким как сезон . Аннотация из Сезон и Вы получаете, что параметр Enum - это любой тип, который удовлетворяет

 E extends Enum<E>

Морису Нафталину (соавтор, Java Generics and Collections)

26
ответ дан 23 November 2019 в 22:45
поделиться

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

Предположим, у вас есть общие узлы в универсальном графе:

public abstract class Node<T extends Node<T>>
{
    public void addNeighbor(T);

    public void addNeighbors(Collection<? extends T> nodes);

    public Collection<T> getNeighbor();
}

Тогда вы можете иметь графы специализированных типов:

public class City extends Node<City>
{
    public void addNeighbor(City){...}

    public void addNeighbors(Collection<? extends City> nodes){...}

    public Collection<City> getNeighbor(){...}
}
1
ответ дан 23 November 2019 в 22:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: