Мне интересно, как лучше всего это сделать?

class Node<E>{ } 

Или

class Node<E extends Comparable<E>>{ }

Тогда мне нужно сделать список или класс bst расширением Comparable, или я могу сделать следующее объявление? Любые предложения будут оценены.

class BST { private Node<E> root; ... }

Или

class BST<E extends Comparable<E>>

Я видел несколько вариантов и хотел бы узнать, какой из них лучше сделать. Спасибо!!!

0
Rob L 7 Мар 2014 в 07:35

3 ответа

Лучший ответ

Я думаю, что вы пытаетесь создать новую коллекцию. Если это нужно для обучения, вы можете просто определить свой BST как:

class BST<E implements Comparable<E>>{
  private Node root;
  //...
  private class Node{ // instances of Node are bound to the instance of BST
    E elem;
    Node left, right;
  }
}

Или со статическим внутренним классом:

class BST<E implements Comparable<E>>{
  private Node<E> root;
  // ...
  private static class Node<X implements Comparable<X>>{
    // similar
  }
}

Обратите внимание, что это хорошая практика, чтобы ваш класс Node был определен как внутренний класс и сделал его частным или с частным конструктором. Это обеспечивает инкапсуляцию реализации.

Хочу отметить, что это не тот подход, который используется в SDK. В библиотеке всегда можно создать структуру данных, передав соответствующий Comparator<E>, так что естественный порядок не требуется или его можно перезаписать. Если вы хотите использовать этот другой подход, посмотрите на реализацию TreeSet или что-то в этом роде. Вы можете либо передать Comparator, либо тип в коллекции будет проверяться во время выполнения для реализации Comparable. Преимущество этого заключается в большей гибкости, поскольку вы можете добавлять в коллекцию объекты, для которых вы не можете изменить реализацию.

Наконец, если вам нужно реализовать коллекцию для проекта или работы, не делайте этого. SDK содержит множество коллекций, а также Коллекции Guava.

1
Giovanni Botta 7 Мар 2014 в 03:53

Все просто.

Родительский (абстрактный) класс расширяет Node и реализует интерфейс Comparable, например:

public class ComparableNode extends Node implemnt Comparable

Или пусть ваш узел реализует Comparable; затем используйте свой общий интерфейс, например:

private List<ComparableNode> list = new ArrayList<CompraableNode> ();
1
Alex Suo 7 Мар 2014 в 03:40

Попробуй это:

class LinkedList<E extends Comparable<E>>{

    class Node<E>{
        E value;
    }

}
1
user3390929 7 Мар 2014 в 03:48