【问题标题】:How to apend a linkedlist onto a specific node of a linkedlist?如何将链表附加到链表的特定节点中?
【发布时间】:2017-07-07 22:55:39
【问题描述】:

我想知道如何将链表添加到另一个链表的特定索引中。我正在尝试做的事情的图片:

我想将item 添加到“John”。 item2 给“Amy”等

到目前为止我的代码:

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);

     }
}

【问题讨论】:

  • 面向对象的良好解决方案:不要将字符串(人名)放入您的第一个链表中。而是创建一个类Customer,其中包含字段personNameitemsBought。后者本身将是对项目链接列表的引用。现在为这些人制作一个Customer 对象的列表。然后将项目的链接列表添加到每个客户将是简单而自然的。

标签: java linked-list append


【解决方案1】:

您可以使用地图来实现此目的。地图的每个键代表“客户”,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】:

    你想将一个人与一个项目列表关联,所以制作pairs,Map是为相同的,你可以在将pair添加到之前初始化List地图,我还添加了代码来打印这些东西(见 cmets into code):

    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

    【讨论】:

      【解决方案3】:

      您将 person 定义为字符串的 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&lt;String, LinkedList&lt;String&gt;&gt; 以保持您的数据结构一致:

          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);
      

      由你决定。

      【讨论】:

        【解决方案4】:

        面向对象的良好解决方案是:不要将字符串(人名)放入您的第一个链表中。而是创建一个类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));
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-01
          • 1970-01-01
          • 2020-02-07
          • 1970-01-01
          • 2020-02-11
          • 2016-08-13
          • 1970-01-01
          相关资源
          最近更新 更多