【问题标题】:Sort dates inside a method of a linked list在链接列表的方法中对日期进行排序
【发布时间】:2015-12-13 15:55:57
【问题描述】:

我有一堆日期添加到待办事项列表list2016,现在我需要这些待办事项列表项按日期排序(最早在前,最晚在后)。

这一切都应该发生在我的 add 方法中,但我不知道该怎么做。有什么想法吗?

public class ToDoListEntry 
{
    String task;
    LocalDate date;
    ToDoListEntry next;

    public ToDoListEntry(LocalDate date, String task) 
    {
        this.task = task;
        this.date = date;
    }
}

接下来是我尝试添加一个数组但没有奏效的地方:

public class ToDoList 
{
    ToDoListEntry first;
    int size;

    public ToDoList ()
    {
        first = null;
        size = 0;
    }

    public void add(ToDoListEntry newTask) 
    {
        if (first == null)
        {
            first = newTask;
        }
        else
        {
            ToDoListEntry zeiger = first;
            while (zeiger.next != null)
            {
                zeiger = zeiger.next;
            }
            zeiger.next = newTask;
        }
        size++;
    }

    public String print()
    {
        String result = "";
        if (first == null) 
        {
            result = "Empty list!\n";
        } 
        else 
        {
            ToDoListEntry pointer = first;
            while (pointer != null) 
            {
                result += "Until " + pointer.date + " Task: " + pointer.task + "\n";
                pointer = pointer.next;
            }
        }
        System.out.println(result);
        return result;
    }
}

最后,主要课程。它应该创建一个新的ToDoList 并打印出来(注意我没有包含print() 方法):

public class MyMainClass
{
    public static void main(String[] args) 
    {
        System.out.println("Test 00: Empty List");
        ToDoList list2016 = new ToDoList();

        list2016.print(); 

        System.out.println("Test 01: add");
        list2016.add(new ToDoListEntry(LocalDate.of(2016, 8, 15), "Do workout"));
        list2016.add(new ToDoListEntry(LocalDate.of(2016, 6, 3), "Buy apples"));
        list2016.add(new ToDoListEntry(LocalDate.of(2016, 10, 11), "Read Books"));
        list2016.print();
    }
}

【问题讨论】:

  • 您将如何手工完成?假设您已经对发票进行了分类,并且您找到了一张旧发票,必须将其插入发票堆中的正确位置。你的策略是什么?
  • 为什么不使用像 ArrayList/LinkedList 这样的内置集合(而不是创建自己的 LinkedList 实现)并使用自定义比较器对其进行排序?
  • 是否有理由必须创建自己的链表结构而不是使用 Java 集合类? IE。这是作业吗?
  • @paisanco 是的,这是一个家庭作业,所以我必须使用 LinkedLists
  • 在不了解讲师意图的情况下,这个问题很难回答,他们是否希望您找到最有效的算法,或者只要可行就足够了暴力方法?

标签: java sorting date linked-list


【解决方案1】:

这是一种低效且混乱的方式。然而,为了实现你想要的,我改变了你的两个课程。这些课程是您的ToDoList 课程和您的main 课程。

ToDoList.java

import java.util.*;
import java.time.*;

public class ToDoList 
{
    ToDoListEntry first;
    ArrayList<LocalDate> datesList = new ArrayList();
    ArrayList<String> results = new ArrayList();

    public ToDoList ()
    {
        first = null;
    }

    public void add(ToDoListEntry newTask)
    {
        if (first == null)
        {
            first = newTask;
        }
        else
        {
            ToDoListEntry zeiger = first;
            while (zeiger.next != null)
            {
                zeiger = zeiger.next;
            }
            zeiger.next = newTask;
        }
    }

    public void sortDates()
    {
        Collections.sort(datesList);
    }

    public void compareAndSort()
    {
        ArrayList<String> tempDates = new ArrayList();
        for(LocalDate lD:datesList)
        {
            tempDates.add(lD+"");
        }
        ArrayList<String> tempSorted = new ArrayList();
        for(String s:tempDates)
        {
            for(String a:results)
            {
                if(a.contains(s))
                {
                    if(!tempSorted.contains(a))
                    {
                        tempSorted.add(a);
                    }
                }
            }
        }

        results=tempSorted;
        for(String s:results)
        {
            System.out.println(s);
        }
    }

    public String print()
    {
        String result = "";
        if (first == null) 
        {
            result = "Empty list!\n";
            System.out.println(result);
        }
        else 
        {
            ToDoListEntry pointer = first;
            while (pointer != null) 
            {
                result += "Until " + pointer.date + " Task: "+ pointer.task +"\n";
                if(LocalDate.now().isBefore(pointer.date))
                {
                    results.add("Until " + pointer.date + " Task: "+ pointer.task);
                }

                datesList.add(pointer.date);
                pointer = pointer.next;
            }
        }
        return result;
    }

    public String printDates()
    {
        String dates = datesList.toString();
        System.out.println(dates);
        return dates;
    }
}

Test.java(这就是你所说的main 类)

import java.util.*;
import java.time.*;

import java.util.*;
import java.time.*;

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("Test 00: Empty List");
        ToDoList list2016 = new ToDoList();

        list2016.print(); 

        System.out.println("Test 01: add");
        list2016.add(new ToDoListEntry(LocalDate.of(2016, 8, 15), "Do workout"));
        list2016.add(new ToDoListEntry(LocalDate.of(2015, 2, 18), "Hand in Homework"));
        list2016.add(new ToDoListEntry(LocalDate.of(2016, 6, 3), "Buy apples"));
        list2016.add(new ToDoListEntry(LocalDate.of(2016, 10, 11), "Read Books"));
        list2016.add(new ToDoListEntry(LocalDate.of(2016, 10, 11), "Read Homework"));

        list2016.print();
        list2016.sortDates();
        list2016.compareAndSort();
    }
}

我有两个笔记。

第一个是因为你特别说soonest 我已经添加了一个删除已经超过当前日期的日期的函数。如果您愿意,可以稍后更改 if 语句 if(LocalDate.now().isBefore(pointer.date))

其次,除非 first 为空,否则您的 ToDoList.print() 实际上不再打印任何内容。

【讨论】:

    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多