2017-02-18 30 views
1

Я хочу знать, как добавить связанный список к определенному индексу другого связанного списка. Изображение того, что я пытаюсь сделать:Как подключить связанный список к определенному узлу связанного списка?

enter image description here

Я хочу добавить item к «Джон». item2 на «Эми» и т.д.

Мой код до сих пор:

import java.util.*; 
public class LinkedListTest { 
    public static void main(String args[]) { 

     LinkedList<String> person = new LinkedList<String>(); 
     LinkedList<String> item = new LinkedList<String>(); 
     LinkedList<String> item2 = new LinkedList<String>(); 

     person.add("John"); 
     person.add("Amy"); 
     person.add("Bob"); 
     person.add("Michael"); 


     item.add("Eggs"); 
     item.add("Bread"); 
     item.add("Ham"); 

     item2.add("Toilet roll"); 
     item2.add("Eggs"); 


     for(int i = 0; i < item.size(); i++){ 
     person.addFirst(item.get(i)); 
     } 
     System.out.println(person); 

    } 
} 
+2

Хорошая и объектно-ориентированное решение: Не помещайте строки (имена) человека в ваш первый связанный список. Вместо этого создайте класс 'Customer' с поля' personName' и 'itemsBought'. Последний сам будет ссылкой на связанный список предметов. Теперь создайте список объектов «Customer» для лиц. Тогда будет просто и естественно добавить связанный список элементов каждому клиенту. –

ответ

1

Хорошее и объектно-ориентированное решение: не помещайте строки (имена людей) в свой первый связанный список.Вместо этого создайте класс Customer с полями personName и itemsBought. Последний сам будет ссылкой на связанный список предметов. Теперь сделайте список Customer объектов для лиц. Тогда будет просто и естественно добавить связанный список элементов каждому клиенту.

public class Customer { 

    String personName; 
    List<String> itemsBought; 

    public Customer(String personName) { 
     this.personName = personName; 
     itemsBought = Collections.emptyList(); 
    } 

    public void setItemsBought(List<String> itemsBought) { 
     this.itemsBought = itemsBought; 
    } 

    @Override 
    public String toString() { 
     return personName + " bought " + itemsBought; 
    } 

} 

С помощью этого класса вы можете сделать:

LinkedList<Customer> person = new LinkedList<>(); 
    LinkedList<String> item = new LinkedList<String>(); 
    LinkedList<String> item2 = new LinkedList<String>(); 

    person.add(new Customer("John")); 
    person.add(new Customer("Amy")); 
    person.add(new Customer("Bob")); 
    person.add(new Customer("Michael")); 


    item.add("Eggs"); 
    item.add("Bread"); 
    item.add("Ham"); 

    item2.add("Toilet roll"); 
    item2.add("Eggs"); 

    person.get(0).setItemsBought(item); 
    person.get(1).setItemsBought(item2); 

    System.out.println(person); 

Это печатает:

[John bought [Eggs, Bread, Ham], Amy bought [Toilet roll, Eggs], Bob bought [], Michael bought []] 

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

person.add(new Customer("John", "Eggs", "Bread", "Ham")); 
    person.add(new Customer("Amy", "Toilet roll", "Eggs")); 
    person.add(new Customer("Bob")); 
    // etc. 

Если мы изменим Customer конструктор к следующему, мы можем:

public Customer(String personName, String... itemsBought) { 
    this.personName = personName; 
    this.itemsBought = new LinkedList<>(Arrays.asList(itemsBought)); 
} 
4

Вы можете использовать карту для достижения этой цели. Каждый ключ карты представляет «Клиент», а LinkedList может использоваться для хранения «предметов» для каждого клиента.

public class LinkedListTest { 
    public static void main(String args[]) { 
     Map<String, LinkedList<String>> personItems = new LinkedHashMap<>(); 

     LinkedList<String> item = new LinkedList<String>(); 
     LinkedList<String> item2 = new LinkedList<String>(); 

     item.add("Eggs"); 
     item.add("Bread"); 
     item.add("Ham"); 

     item2.add("Toilet roll"); 
     item2.add("Eggs"); 

     personItems.put("John", item); 
     personItems.put("Amy", item2);  


     for(String cust: personItems.keySet()){ 
      System.out.println(personItems.get(cust)); 
     } 

    } 
} 

Несколько преимуществ этого является:

  1. Вы можете посмотреть список пунктов для клиента на основе имени.
  2. Плюс, используя LinkedHashMap, заказ, в который вы вставляете клиентов, сохраняется.

Надеется, что это помогает!

2

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

public static void main(String[] args) { 
     HashMap<String,LinkedList<String>> person = new HashMap<String,LinkedList<String>>(); 
     LinkedList<String> item = new LinkedList<String>(); 
     LinkedList<String> item2 = new LinkedList<String>(); 

     //Add your people into the Map 
     person.put("John",item); 
     person.put("Amy",item2); 
     person.put("Bob",new LinkedList<String>()); 
     person.put("Michael",new LinkedList<String>()); 

     //Add stuff to item for John 
     item.add("Eggs"); 
     item.add("Bread"); 
     item.add("Ham"); 

     //Add stuff to item for Amy 
     item2.add("Toilet roll"); 
     item2.add("Eggs"); 

     //To add stuff for Bob : 
     person.get("Bob").add("Chocolate"); 

     //To add stuff for Michael : 
     person.get("Michael").add("Chips"); 

     //To see what's inside for ONE person : 
     for(String stuff : person.get("John")){ 
      System.out.println(stuff); 
     } 

     //To see ALL : 
     for(String people : person.keySet()){ 
      System.out.println(people+" has bought :"); 
      for(String stuff : person.get(people)){ 
       System.out.println(stuff); 
      } 
     } 
    } 

И на самом деле я не уверен, что LinkedList необходимо, простой ArrayList может быть достаточно, посмотрите на это тоже: http://www.sergiy.ca/img/doc/java-map-collection-cheat-sheet.gif

+0

Хороший чит-лист, спасибо за ссылку. –

1

Вы определяете человека как LinkedList of Strings.

Так что, очевидно, нельзя добавить LinkedList в строку.

Вы могли бы иметь связанный список связанных списков строк:

LinkedList<LinkedList<String>> person = new LinkedList<>(); 
LinkedList<String> item = new LinkedList<String>(); 
LinkedList<String> item2 = new LinkedList<String>(); 

person.add(new LinkedList<>(Collections.singleton("John"))); 
person.add(new LinkedList<>(Collections.singleton("Amy"))); 
person.add(new LinkedList<>(Collections.singleton("Bob"))); 
person.add(new LinkedList<>(Collections.singleton("Michael"))); 

item.add("Eggs"); 
item.add("Bread"); 
item.add("Ham"); 

item2.add("Toilet roll"); 
item2.add("Eggs"); 

person.get(0).addAll(item); 
person.get(1).addAll(item2); 

System.out.println(person); 

Но тогда вы бы в конечном итоге:

  • смешивая понятие человека с понятием пунктов.
  • приходится иметь дело с индексами при доступе к определенному лицу.

Лучший выбор для будущих головных болей.

Предпочтительный выбор будет идти Map<String, LinkedList<String>>, чтобы сохранить структуру данных в соответствии:

Map<String, LinkedList<String>> person = new HashMap<>(); 
    LinkedList<String> item = new LinkedList<String>(); 
    LinkedList<String> item2 = new LinkedList<String>(); 

    item.add("Eggs"); 
    item.add("Bread"); 
    item.add("Ham"); 

    item2.add("Toilet roll"); 
    item2.add("Eggs"); 

    person.put("John", item); 
    person.put("Amy", item2); 
    person.put("Bob", new LinkedList<>()); 
    person.put("Michael", new LinkedList<>()); 

    System.out.println(person); 

до вас.