首页 > 解决方案 > 如何使用 Java 中的 actionlistener 按字母顺序对联系人列表进行排序?

问题描述

我有一个 java 任务,我应该按字母顺序对示例联系人列表进行排序,从姓氏到名字,包括他们的电话号码。我一直在尝试使用 lastName、firstName、nameList 和 numberList 之类的东西,但仍然无法获得正确的信息来让列表按字母顺序从姓氏到名字进行排序。如果我能得到一些帮助或提示来帮助我前进,那就太好了。我目前也在使用 actionlistener 来帮助我对列表进行排序。

这是构造函数代码的一部分。

public class ContactList extends JFrame implements ActionListener, ListSelectionListener {

    JMenuItem newMI, openMI, saveMI, saveAsMI, exitMI;
    JMenuItem searchMI, deleteMI, updateMI, newEntryMI, sortMI;
    JTextField lastName, firstName, phoneNumber;
    JList<String> listView;
    DefaultListModel<String> nameList = new DefaultListModel<String>();
    Vector<String> numberList = new Vector<String>();
    File currentFile = null;

    /**
     * Constructor
     */
    public ContactList() {
        super("Phone Contacts");          // set frame title
        setLayout(new BorderLayout());    // set layout

        // create menu bar
        JMenuBar menubar = new JMenuBar();
        setJMenuBar(menubar);

        // create file menu
        JMenu fileMenu = new JMenu("File");
        menubar.add(fileMenu);
        newMI = fileMenu.add(new JMenuItem("New"));
        newMI.addActionListener(this);
        openMI = fileMenu.add(new JMenuItem("Open"));
        openMI.addActionListener(this);
        fileMenu.addSeparator();
        saveMI = fileMenu.add(new JMenuItem("Save"));
        saveAsMI = fileMenu.add(new JMenuItem("Save As ..."));
        fileMenu.addSeparator();
        exitMI = fileMenu.add(new JMenuItem("Exit"));
        exitMI.addActionListener(this);

        // create edit menu
        JMenu editMenu = new JMenu("Edit");
        menubar.add(editMenu);
        updateMI = editMenu.add(new JMenuItem("Update"));
        updateMI.addActionListener(this);
        newEntryMI = editMenu.add(new JMenuItem("New Entry"));
        newEntryMI.addActionListener(this);
        deleteMI = editMenu.add(new JMenuItem("Delete"));
        deleteMI.addActionListener(this);
        editMenu.addSeparator();
        searchMI = editMenu.add(new JMenuItem("Search"));
        searchMI.addActionListener(this);
        sortMI = editMenu.add(new JMenuItem("Sort"));
        sortMI.addActionListener(this);

        // create phone list and controls
        JPanel listPanel = new JPanel(new BorderLayout());
        add(listPanel, BorderLayout.CENTER);
        JLabel label = new JLabel("Name List", JLabel.LEFT);
        listPanel.add(label, BorderLayout.NORTH);
        
        listView = new JList<String>(nameList);
        listView.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        listView.addListSelectionListener(this);
        JScrollPane listScroller = new JScrollPane(listView);
        listPanel.add(listScroller, BorderLayout.CENTER);
        JPanel panel = new JPanel(new BorderLayout());
        add(panel, BorderLayout.WEST);
        JPanel editPanel = new JPanel(new GridLayout(6, 1));
        panel.add(editPanel, BorderLayout.NORTH);
        label = new JLabel("Last Name", Label.LEFT);
        editPanel.add(label);
        lastName = new JTextField();
        editPanel.add(lastName);
        label = new JLabel("First Name", Label.LEFT);
        editPanel.add(label);
        firstName = new JTextField();
        editPanel.add(firstName);
        label = new JLabel("Phone Number", Label.LEFT);
        editPanel.add(label);
        phoneNumber = new JTextField();
        editPanel.add(phoneNumber);
    }

这是分配的动作侦听器代码。我也不需要对电话号码进行排序。只是姓对名。来源来自我试图弄清楚的 sortMI 问题。

// implementing ActionListener
    public void actionPerformed(ActionEvent event) {
        Object source = event.getSource();
        if(source == newMI) {
            nameList.clear();
            numberList.clear();
            currentFile = null;
            display(-1);
            setTitle("Phone Contacts");   // reset frame title
        }
        else if(source == openMI) {
            doOpen();
        }
        else if(source == deleteMI) {
            nameList.remove(getState());
            numberList.remove(getName());
        }
        else if(source == exitMI) {
            System.exit(0);
        }
        else if(source == updateMI) {
            int index = listView.getSelectedIndex();
            String name = lastName.getText().trim() + " " + firstName.getText().trim();
            String number = phoneNumber.getText().trim();
            if(index < 0) {  // add a new entry
                nameList.addElement(name);
                numberList.addElement(number);
                index = nameList.getSize()-1;
            }
            else {  // update an existing entry
                nameList.set(index, name);
                numberList.set(index, number);        
            }
            listView.setSelectedIndex(index);
            listView.ensureIndexIsVisible(index);
        }
        else if(source == newEntryMI) {
            listView.clearSelection();
            display(-1);
        }
        else if(source == searchMI) {
            String searchName = JOptionPane.showInputDialog(this,
                                "Please enter a name (last first) to search:");
            System.out.println("Name to search: " + searchName);
            nameList.contains(searchName);
            return;
        }
        else if(source == sortMI) {
            lastName.getText(); 
            firstName.getText();
        }
    }

我也确实在 java 中寻找了其他排序示例,但它不涉及带有 actionlistener 的示例。

标签: javasortingactionlistener

解决方案


  • 在 class 中使用方法copyIntoDefaultListModel来获取nameList数组的内容。
  • 在 class 中使用方法sortjava.util.Arrays对数组进行排序。
  • DefaultListModel从排序后的数组创建一个新的。
  • 为 设置模型listView
Object[] objs = nameList.copyInto();
Arrays.sort(objs, new Comparator<Object>() {
        @Override
        public int compare(Object o1, Object o2) {
            String s1 = o1 == null ? "" : o1.toString();
            String s2 = o2 == null ? "" : o2.toString();
            return s1.compareTo(s2);
        }
    });
nameList = new DefaultListModel(objs);
listView.setModel(nameList);

或者,您可以使用流 API

Object[] objs = nameList.copyInto();
List<String> list = Arrays.stream(objs)
                          .map(obj -> obj == null ? "" : obj.toString())
                          .sorted()
                          .collect(Collectors.toList());
Vector<Object> v = new Vector<>(list);
nameList = new DefaultListModel(v);
listView.setModel(nameList);

推荐阅读