2017-02-18 97 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

好和麪向對象的解決方案:不要把字符串(人名)成你的第一個鏈表。相反,用'personName'和'itemsBought'來創建一個類'Customer'。後者本身就是對項目鏈接列表的引用。現在爲這些人制作一個「客戶」對象列表。然後,將項目的鏈接列表添加到每個客戶將是直接和自然的。 –

回答

1

好的和麪向對象的解決方案是:不要把字符串(人名)放到你的第一個鏈表中。相反,創建一個類Customer與字段personNameitemsBought。後者本身就是對項目鏈接列表的引用。現在爲這些人列出一個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 []] 

我會覺得它生成列表自下而上更方便:添加項目到客戶將客戶添加到人員列表之前。我們可以使用可變參數構造函數來添加更多的便利,該構造函數接受名稱和項目。想如果我們可以這樣做:

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。

很明顯,不能將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); 

給你。