2014-10-14 3 views
2

자바에서 제네릭을 사용하여 추상 AVL 트리 구현을 만들고 있습니다. 동일한 데이터 인스턴스를 사용하지만 다른 키를 사용하여 트리의 인스턴스를 여러 개 가져야합니다. 예 : 데이터 클래스 자동차를 고려해 보겠습니다. 같은 시간에 두 그루 나무에 있어야하는 경우가 필요합니다. 그러나 첫 번째 나무는 번호판에 따라 분류되고 두 번째 나무는 VIN 번호에 따라 분류됩니다. 어떻게 보장할까요?다른 비교기를 사용하여 일반 구조의 두 인스턴스를 만드는 방법은 무엇입니까?

+0

트리 클래스가 어떻게 보이는지 보여주십시오. 문제가 무엇인지는 분명하지 않습니다. 객체는 Java에서 다른 비교자를 사용하여 정렬 된 트리에 쉽게 저장할 수 있습니다. –

+0

예를 들어 TreeMap을 보았습니까? JDK에서 Comparator를 어떻게 사용합니까? – SMA

답변

2

추상 트리 구현은 generics 위에 구축되었으므로 비교기를 avl 트리 생성자에 전달할 수 있으므로 비교기에 따라 트리에서 순서를 유지하는 방법을 알 수 있습니다.

class Tree<T> { 

    private final Comparator<T> comparator; 


    public Tree(final Comparator<T> comparator) { 
     this.comparator = comparator; 
    } 
} 

class Car { 
    private String model; 
    private String VIN; 
    private String licencePlate; 


    public String getModel() { 
     return this.model; 
    } 


    public String getVIN() { 
     return this.VIN; 
    } 


    public String getLicencePlate() { 
     return this.licencePlate; 
    } 

} 


public static void main(final String[] args) { 

    Comparator<Car> comp1 = new Comparator<Car>() { 

     @Override 
     public int compare(final Car car1, final Car car2) { 
      return car1.getVIN().compareTo(car2.getVIN()); 
     } 
    }; 

    Comparator<Car> comp2 = new Comparator<Car>() { 

     @Override 
     public int compare(final Car car1, final Car car2) { 
      return car1.getLicencePlate().compareTo(car2.getLicencePlate()); 
     } 
    }; 

    Tree<Car> tree1 = new Tree<Car>(comp1); //this tree will keep order according to car's VIN 
    Tree<Car> tree2 = new Tree<Car>(comp2); // this tree will keep order according to car's licence plate 


} 
2

트리를 작성할 때 비교기를 제공해야합니다. simpke 구현은 루트 노드에 대한 참조를 유지할 수 있습니다. 팩토리 메서드를 사용하면 다음과 같이 작동 할 수 있습니다.

public class MyTreeNode<T> { 
    private Comparator<? super T> comparator; 

    protected MyTreeNode() {} 

    public static <T> MyTreeNode<T> create(Comparator<? super T> comparator) { 
     MyTreeNode<T> node = new MyTreeNode<T>(); 
     node.comparator = comparator; 
     return node; 
    } 
} 

사용 방법에 따라 참조를 하위 노드로 전달할 수 있습니다.

관련 문제