【问题标题】:How do I reorder a linked list?如何重新排序链接列表?
【发布时间】:2020-04-10 06:42:51
【问题描述】:

我正在尝试做一个关于链接列表的作业,很遗憾,我无法在线发布我的代码。但一般问题是这样的:

我有一个有机体的链接列表: 列表 -> 斑马 -> 鬣狗 -> 狮子 -> 草

但我希望列表按顺序显示(食物链): 有序列表 -> 狮子 -> 鬣狗 -> 斑马 -> 草

另外,我可以将一个有机体添加到列表中,例如

list.add("T-Rex");

那么我想要的结果应该是 有序列表 -> 霸王龙 -> 狮子 -> 鬣狗 -> 斑马 -> 草

如何添加有机体,然后以显示层次结构的方式对它们进行排序?我可以放下的生物数量有限,所以我确切地知道将它们放在哪里。例如,我知道如果我放 T-Rex,它总是在 Lion 之上,Hyena 总是在 Grass 之前……等等。我一直在尝试在 YouTube 和 Google 上找到教程但他们主要是按字母顺序对数字或字符串进行排序,我认为这对我的问题没有帮助。

感谢任何帮助,因为这是我第一次处理链表。

【问题讨论】:

  • 我猜你会用一个整数来表示每个物种在层次结构中的高度,那么希望按数字排序的教程会有所帮助。
  • 在这种情况下,优先队列是为了救援,因为生物的数量是有限的而且你已经知道名字了,按照食物链的顺序给它们一个优先级,比如 T-Rex 的优先级为 1 ,Lion 2,Hyena-3 等等然后申请最小优先队列,希望它能解决你的问题。
  • 谢谢你们!我查看了优先队列,我认为它应该有所帮助!

标签: java linked-list


【解决方案1】:

你可以使用

add(int index, E element);

它将指定元素插入此列表中的指定位置并移动当前位于该位置的元素。因此,当您知道元素的位置时,您可以在所需位置添加新元素。

list.add(0,"T-Rex");

【讨论】:

    【解决方案2】:

    您可以将列表中的每一种动物都映射到某种等级值e.g: T-Rex - 1, Lion - 2, ...。然后,您可以将所有值放入 LinkedList 并使用自定义比较器进行排序,或者作为优先级队列的替代方案。

    因此,您将在列表中排序一个层次结构。 示例:

    class Organism {
        String name;
        int level;
    
        public Organism(String name, int level) {
             ...
        }
    }
    PrioriQueue q = new PriorityQueue(...custom_comparator...);
    q.add(...add_all_organism_here....)
    

    【讨论】:

      【解决方案3】:

      我会这样做:

      创建实现 Comparable 并具有特定于您的类的自定义自然排序的类 Organism。

      public class Organism implements Comparable<Organism> {
          private Integer hierarchy;
          private String name;
      
          public Organism (String nameArg, Integer hierarchyArg) {
               name = nameArg;
               hierarchy = hierarchyArg;
          }
      
          public Integer getHierarchy() {
              return hierarchy;
          }
      
          public String getName() {
              return name;
          }
      
          @Override
          public int compareTo(Organism a) 
          {
              return this.getHierarchy().compareTo( a.getHierarchy() );
          }
      }
      

      现在我可以按任意顺序添加到列表中:

      //Put a big gap between the numbers so if you need later you can add more organisms in between 
      list.add(new Organism("T-Rex", 1000));
      list.add(new Organism("Zebra", 10));
      list.add(new Organism("Lion", 500));
      list.add(new Organism("Hyena", 200));
      

      然后你可以使用 Java 对它们进行排序:

      // Java old way of sorting. It will modify the 'list' itself
      Collections.sort(list); 
      
      //Java 8+ way of sorting. It does not modify the 'list' but create a new one.
      List<String> sortedList = list.stream().sorted().collect(Collectors.toList());
      

      Comparable 接口的文档: https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2018-12-06
        • 2019-09-18
        • 2020-06-15
        • 2023-03-08
        • 2011-01-11
        • 1970-01-01
        • 1970-01-01
        • 2023-02-21
        • 2010-09-05
        相关资源
        最近更新 更多