2016-06-10 1 views
2

В основном я пытаюсь реализовать что-то вроде этого, где партнерский узел имеет тип «type1», клиентский узел имеет «type2», и пользовательские узлы имеют «тип 3». И каждый из узлов может иметь несколько дочерних узлов. Таким образом, Partner1 может иметь под собой любое количество клиентских узлов, так же клиентские узлы могут иметь под собой любое количество пользователей.Как создать дерево с несколькими типами узлов, и каждый узел может иметь несколько дочерних узлов в java

enter image description here

Я начал реализацию, но я застрял now.The код, который я написал в следующем.

public class ClientProperty { 
 
    public class Root{}   //NodeType1 
 

 
    public class Partner{  //NodeType2 
 
     public String partner_id; 
 
     public String partner_name; 
 
     public int partner_node_id; 
 

 
     public Partner(String partner_id,String partner_name,int partner_node_id){ 
 
      this.partner_id = partner_id; 
 
      this.partner_name = partner_name; 
 
      this.partner_node_id = partner_node_id; 
 
     } 
 
    } 
 

 
    public class Clients{  //NodeType3 
 
     public String client_name; 
 
     public String client_id; 
 
     public int client_node_id; 
 
     public Map<Enum,List<Enum>> clientproperty = new HashMap<Enum,List<Enum>>(); 
 

 
     public Clients(String client_name, String client_id, int client_node_id,Map<Enum,List<Enum>> clientproperty){ 
 
      this.client_name = client_name; 
 
      this.client_id = client_id; 
 
      this.client_node_id = client_node_id; 
 
      this.clientproperty = clientproperty; 
 
     } 
 
    } 
 
    public class Users{   //NodeType4 
 
     public String user_name; 
 
     public String user_id; 
 
     public int user_node_id; 
 

 
     public Users(String user_id,String user_name, int user_node_id){ 
 
      this.user_id = user_id; 
 
      this.user_name = user_name; 
 
      this.user_node_id = user_node_id; 
 
     } 
 
    } 
 
    public class Node{ 
 
     Node next; 
 
     Object nodes; 
 

 
     public Node(){ 
 
      next = null; 
 
     } 
 

 
     public Node(Object nodes, Node next){ 
 
      this.nodes = nodes; 
 
      this.next = next; 
 
     } 
 
    } 
 
}

Позвольте мне знать, если некоторые идеи требуется

+0

Я застреваю в точке, какова должна быть структура моего класса Node. Я не знаю, как указать узел на многие другие узлы в иерархическом типе дерева. –

+1

@GhostCat Спасибо за головы. Мы должны признать усилия наших коллег-разработчиков. –

ответ

1

Первые несколько более неспецифические вещи:

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

Затем вы хотите прочитать около java encoding style convention; поскольку вы нарушаете довольно некоторые из них (что просто не помогает, когда вы показываете свой код для более опытных java-кодеров).

Наконец, самое главное: вы хотите прочитать совсем немного о OO дизайн в целом (я рекомендую «agile-практик» Роберт Мартин, есть бесплатный PDF из «C версии #» этой книги):

Он начинает остроумие тот факт, что

а) является клиент/пользователь является «другая ответственность», чем

б) быть какой-то элемент в графе

другими словами: вывводя слишком много «ролей» в ваши классы.

Смысл: вы хотите ввести различные виды абстракций. Например:

interface GraphNode<N, C extends GraphNode> { 
    N getNodeContent(); 
    List<C> getChildrenNodes(); 
} 

Теперь вы можете выразить: любой «узел» имеет некоторое содержание (которое может быть пользователем или клиента или любой другой объект); и он имеет список (или набор) дочерних элементов, которые также являются «узлами».

0

Здесь я предоставляю вам дизайн высокого уровня, вы должны предоставить реализацию getNext() и getChildren() согласно вашему требованию. Надеюсь, это поможет вам, Дайте мне знать. Если у вас есть другие мысли.

// As all the entities are a kind of Node , so this interface should be implemented by all the entities . You can put some more methods in this interface, If required to be a Node type. 

interface Node { 
    Node getNext(); 
    List<? extends Node> getChildren(); 
} 

class Root implements Node { 
    private List<Partner> partners; 

    @Override /*Implementation required*/ 
    public Root getNext() { 
     return null; // Return next node 
    } 

    @Override /*Implementation required*/ 
    public List<Partner> getChildren() { 
     return partners; 
    } 
} 

class Partner implements Node { 
    private List<Client> clients; 
    @Override /*Implementation required*/ 
    public Partner getNext() { 
     return null; // Return next node 
    } 

    @Override /*Implementation required*/ 
    public List<Client> getChildren() { 
     return clients; 
    } 
} 

class Client implements Node { 
    private List<User> users; 

    @Override /*Implementation required*/ 
    public Client getNext() { 
     return null; // Return next node 
    } 

    @Override /*Implementation required*/ 
    public List<User> getChildren() { 
     return users; 
    } 
} 

//As per your requirement, User class is leaf node, so you can return null in getChildren() call; 
class User implements Node { 
    private List<? extends Node> children; 

    @Override /*Implementation required*/ 
    public User getNext() { 
     return null; // Return next node 
    } 

    @Override /*Implementation required*/ 
    public List<? extends Node> getChildren() { 
     return children; 
    } 
} 

Примечание: Ее высокий уровень дизайна. С помощью этого дизайна вы можете ввести больше типов в своем приложении, если это потребуется в будущем.

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