2014-10-15 3 views
-1

Я пытаюсь реализовать собственное сортированное двоичное дерево в java, и у меня были некоторые проблемы с сравнениями. Я пытаюсь реализовать родовое дерево, так что я хотел бы сделать что-то вроде:Сравнение переменных класса Object

public boolean contains(int i){ 
    if(i == currentNode.value) 
     return true; 
    else if (i > currentNode.value) 
     // Go right 
    else if (i < currentNode.value) 
     // Go left 
    ... 
} 

Но я использую объекты (и я предполагаю, что они являются объектами, которые можно сравнить), так что я хотел чтобы сделать что-то вроде:

public boolean contains(Object o){ 
    if(o == currentNode.value) // value is of Object class 
     return true; 
    else if (o > currentNode.value) // Problem 
     // Go right 
    ... 
} 

так что моя проблема сейчас в том, что это не представляется возможным использовать операторы> и < с объектами, и до сих пор я не смог придумать другой способ пойти об этом.

+0

Вы можете использовать Сопоставимые для объектов, которые поддерживают его, и использовать значение System.identityHashCode для сравнения объектов, которые не , Конечно, есть некоторые (относительно небольшие) шансы столкновения с хеш-кодами, поэтому вы, вероятно, захотите сначала сравнить имена классов, «истощить» хэш-пространство, а затем иметь стратегию «пунта», если вы все равно получите столкновение. –

ответ

1

Объекты не по своей природе сравнимы, яблоко больше чем апельсин? Объекты, которые сопоставимы, реализуют интерфейс Comparable. Таким образом, простой ответ, чтобы заменить каждый экземпляр Object в вашем бинарном дереве с сопоставимым и имеет

int comparison = o.compareTo(currentNode.Value) 
if(comparison ==0){ 
    ... 
} else if (comparison > 0) { 
    ... 
} else { 
    // comparison < 0 
    ... 
} 

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

public class BinaryTree<T extends Comparable> { 
    public boolean contains(T target) { 
     .... 
    } 
    ... 
} 

Тогда вы могли бы использовать его как

BinaryTree<Integer> tree = ... 
tree.add(1); 
tree.add(2); 
tree.add("three"); // <-- Syntax error, compiler would fail. 
... 
Integer first = tree.getFirst(); 
Integer last = tree.getLast(); 
1

Если вы используете какой-либо Object, то переопределите метод equals(), для проверки равенства. Если вы хотите их сравнить, тогда используйте интерфейс Comparable или создайте для них Comparator.

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

1

Объекты, реализующие Comparable в java, будут иметь метод compareTo, который возвращает целое число. Вам просто нужно, чтобы сделать ваши> и < тесты на том, что:

int res = comparable.compareTo(other); 
if(res == 0){ 
    return true; 
} else if(res > 0){ 
    //go right 
    ... 
} else { 
    //go left 
    ... 
} 
0

Это именно то, что Java сопоставимыми и дженерики для сравнения!

Ваши объекты должны реализовывать метод «int compareTo (Object obj)». Если вы создавали бинарное дерево поиска вашего содержать метод будет выглядеть примерно так:

public class MyTree<T extends Comparable<T>>{ 
... 
    public boolean contains(TreeNode<T> node, T target)(
      if(node == null) return false; 
      if(node.data.equals(target)){ 
       return true; 
      } 
      if(node.data.compareTo(target) > 0){//node is greater than target go left 
       return contains(node.left, target); 
      }else{ 
       return contains(node.right, target)//node is less than target go right 
      } 
    } 
} 
Смежные вопросы