【问题标题】:Sorting an array with multiple elements对具有多个元素的数组进行排序
【发布时间】:2017-08-25 21:22:10
【问题描述】:

我正在 java 中为一个班级项目制作一个待办事项列表。在 jList 中,我显示一个日期和一个表示日期的字符串以及当天需要做什么。我还希望能够按日期对这些事件进行排序,以便更早到期的任务首先出现。我知道如何使用冒泡排序对日期列表进行排序,但我不知道如何将其应用于我的列表,因为每个项目都包含一个日期和一个字符串。这是我到目前为止的代码。有谁知道我将如何按顺序对日期进行排序并将字符串附加到日期。谢谢。

public class ToDoListManager {

    final int maxitems = 20;
    int items = 0;
    String[] toDoList = new String[20];
    Date[] Dates = new Date[20];

    String addItem(String toDo, Date date) {
        if (items == maxitems) {
            return ("No more Space");
        } else if (toDo.equalsIgnoreCase("") || (toDo == null) || (date == null)) {
            return ("All fields required");
        } else if (items < maxitems) {
            Dates[items] = date;
            SimpleDateFormat dt1 = new SimpleDateFormat("yyyy-MM-dd");
            toDoList[items] = "On " + dt1.format(date) + " " + toDo;
            items = items + 1;
            return (toDo + " Was Added to the List");
        }
        return null;
    }

    void Order(Date[] dates) {
        Date temp;
        boolean fixed = false;
        while (fixed == false) {
            fixed = true;
            for (int i = 0; i < dates.length - 1; i++) {
                if (dates[i].before(dates[i + 1])) {
                    temp = dates[i + 1];
                    dates[i + 1] = dates[i];
                    dates[i] = temp;
                    fixed = false;
                }
            }

        }
        System.out.println(dates);

    }

    String[] getItems() {
        String[] displayList = new String[items];
        for (int i = 0; i < items; i++) {
            displayList[i] = toDoList[i];

        }

        return displayList;

    }
}

【问题讨论】:

  • 考虑首先创建一个代表您的任务的对象,其中包含日期和字符串。
  • 不要使用parallel collections。定义一个ToDo 类。

标签: java string list sorting date


【解决方案1】:

您在问题中提到了 JList,因此我假设您希望在此处查看已排序的 TODO。这是一种可能的方法:

JList 由 ListModel&lt;E&gt; 实例支持。这是一个通用类,可以包含E 的实例列表。因此,将其连接在一起的一种可能方法是:

  • 创建一个代表待办事项列表中的项目的类(ToDo 类,其字段包含例如日期和待办事项文本)。
  • 定义一个或多个 ToDo 实例的比较器 - 例如一个基于日期,另一个基于文本,无论您需要什么。
  • 使用您的 ToDo 实例填充一个列表(或另一个集合),并使用您的比较器对其进行排序。
  • 创建一个由您的列表支持的 ListModel 实现并将其设置为 JList 组件。 ListModel 实现可以是例如AbstractListModel 的扩展名。另请参阅example of sorted ListModel implementation
  • 要在 List 中以有意义的方式显示 ToDo,请在 ToDo 类上创建一个 toString() 实现(JList 将调用它来获取对象的字符串表示形式)或supply your own ListCellRenderer to the JList instance
  • 如果您需要重新排序,请确保您的 ListModel 实现正确notifies JList 每次更改顺序时。

【讨论】:

    【解决方案2】:

    为什么不使用 Date->String> 的 SortedMap?

    【讨论】:

    【解决方案3】:

    正如迈克尔所说,另一种方法是拥有一个对象。这将存储您想要的变量,日期和字符串。如果您将来想要添加另一个变量,您可以轻松地将其添加到对象中,而无需编辑存储对象的列表。

    public class Todo {
    
    private Date date;
    private String info;
    
    public Todo(Date date, String info){
        this.date = date;
        this.info = info;
    }
    
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public String getInfo() {
        return info;
    }
    public void setInfo(String info) {
        this.info = info;
    }
    }
    

    【讨论】:

    【解决方案4】:

    这大致就是我构建您的应用程序的方式。为简洁起见,我省略了 ordergetItems 方法。

    public class ToDoListManager {
    
        private static class ToDo
        {
            public final String text;
            public final Date   date;
            public ToDo(String text, Date date)
            {
                this.text = text;
                this.date = date;
            }
        }
    
        final int maxItems = 20;
        final List<ToDo> todos = new LinkedList<>();
    
        String addItem(String text, Date date) {
            if (todos.size() == maxItems) {
                return ("No more Space");
            } else if (text == null || text.equalsIgnoreCase("") || date == null) {
                return ("All fields required");
            } else if (todos.size() < maxItems) {
    
                final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                text = "On " + format.format(date) + " " + text;
    
                todos.add(new ToDo(text, date));
    
                return (text + " Was Added to the List");
            }
            return null;
        }
    }
    

    您可以看到,一旦您放弃原始数组而使用集合,并开始使用类,事情就会变得更加简单。


    现在回答您的问题:与其实现自己的排序,不如使用Collections.sort(todos)

    为了对您的列表进行适当的排序,您将需要ToDo 来实现Comparable&lt;ToDo&gt;。我将把它留给你来研究和实施。

    【讨论】:

    • 谢谢。这很有帮助。我现在遇到的问题是我不确定如何让 jList 显示新类 ToDo 的对象。
    • 我不熟悉JLists,但如果你需要一个原始数组(即ToDo[]),那么你可以调用todos.toArray()
    • 不,我使用需要字符串数组 (String[]) 的 jLists setListData 方法。不确定如何让列表显示此类,因为它似乎只想显示字符串数组。
    • 如果您将创建JList 的代码编辑到您的问题中,我会看看。
    • 这就是我能找到的全部。不确定它是否是您正在寻找的东西。 jList1 = new javax.swing.JList();