如何使用java中的actionlistener按字母顺序对联系人列表进行排序?

blmhpbnm  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(419)

我有一个java任务,我应该按照从姓到名的字母顺序排列一个联系人列表,包括他们的电话号码。我一直在尝试使用诸如lastname、firstname、namelist和numberlist之类的东西,但仍然无法获得正确的信息,以便按照姓氏到名字的字母顺序对列表进行排序。如果我能得到一些帮助或提示来帮助我前进,那就太好了。我目前还使用actionlistener来帮助我对列表进行排序。
这里是构造函数代码的一部分。

  1. public class ContactList extends JFrame implements ActionListener, ListSelectionListener {
  2. JMenuItem newMI, openMI, saveMI, saveAsMI, exitMI;
  3. JMenuItem searchMI, deleteMI, updateMI, newEntryMI, sortMI;
  4. JTextField lastName, firstName, phoneNumber;
  5. JList<String> listView;
  6. DefaultListModel<String> nameList = new DefaultListModel<String>();
  7. Vector<String> numberList = new Vector<String>();
  8. File currentFile = null;
  9. /**
  10. * Constructor
  11. */
  12. public ContactList() {
  13. super("Phone Contacts"); // set frame title
  14. setLayout(new BorderLayout()); // set layout
  15. // create menu bar
  16. JMenuBar menubar = new JMenuBar();
  17. setJMenuBar(menubar);
  18. // create file menu
  19. JMenu fileMenu = new JMenu("File");
  20. menubar.add(fileMenu);
  21. newMI = fileMenu.add(new JMenuItem("New"));
  22. newMI.addActionListener(this);
  23. openMI = fileMenu.add(new JMenuItem("Open"));
  24. openMI.addActionListener(this);
  25. fileMenu.addSeparator();
  26. saveMI = fileMenu.add(new JMenuItem("Save"));
  27. saveAsMI = fileMenu.add(new JMenuItem("Save As ..."));
  28. fileMenu.addSeparator();
  29. exitMI = fileMenu.add(new JMenuItem("Exit"));
  30. exitMI.addActionListener(this);
  31. // create edit menu
  32. JMenu editMenu = new JMenu("Edit");
  33. menubar.add(editMenu);
  34. updateMI = editMenu.add(new JMenuItem("Update"));
  35. updateMI.addActionListener(this);
  36. newEntryMI = editMenu.add(new JMenuItem("New Entry"));
  37. newEntryMI.addActionListener(this);
  38. deleteMI = editMenu.add(new JMenuItem("Delete"));
  39. deleteMI.addActionListener(this);
  40. editMenu.addSeparator();
  41. searchMI = editMenu.add(new JMenuItem("Search"));
  42. searchMI.addActionListener(this);
  43. sortMI = editMenu.add(new JMenuItem("Sort"));
  44. sortMI.addActionListener(this);
  45. // create phone list and controls
  46. JPanel listPanel = new JPanel(new BorderLayout());
  47. add(listPanel, BorderLayout.CENTER);
  48. JLabel label = new JLabel("Name List", JLabel.LEFT);
  49. listPanel.add(label, BorderLayout.NORTH);
  50. listView = new JList<String>(nameList);
  51. listView.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
  52. listView.addListSelectionListener(this);
  53. JScrollPane listScroller = new JScrollPane(listView);
  54. listPanel.add(listScroller, BorderLayout.CENTER);
  55. JPanel panel = new JPanel(new BorderLayout());
  56. add(panel, BorderLayout.WEST);
  57. JPanel editPanel = new JPanel(new GridLayout(6, 1));
  58. panel.add(editPanel, BorderLayout.NORTH);
  59. label = new JLabel("Last Name", Label.LEFT);
  60. editPanel.add(label);
  61. lastName = new JTextField();
  62. editPanel.add(lastName);
  63. label = new JLabel("First Name", Label.LEFT);
  64. editPanel.add(label);
  65. firstName = new JTextField();
  66. editPanel.add(firstName);
  67. label = new JLabel("Phone Number", Label.LEFT);
  68. editPanel.add(label);
  69. phoneNumber = new JTextField();
  70. editPanel.add(phoneNumber);
  71. }

下面是分配的actionlistener代码。我也不需要对电话号码进行分类。从姓到名。这些消息来源于我想弄清楚的sortmi问题。

  1. // implementing ActionListener
  2. public void actionPerformed(ActionEvent event) {
  3. Object source = event.getSource();
  4. if(source == newMI) {
  5. nameList.clear();
  6. numberList.clear();
  7. currentFile = null;
  8. display(-1);
  9. setTitle("Phone Contacts"); // reset frame title
  10. }
  11. else if(source == openMI) {
  12. doOpen();
  13. }
  14. else if(source == deleteMI) {
  15. nameList.remove(getState());
  16. numberList.remove(getName());
  17. }
  18. else if(source == exitMI) {
  19. System.exit(0);
  20. }
  21. else if(source == updateMI) {
  22. int index = listView.getSelectedIndex();
  23. String name = lastName.getText().trim() + " " + firstName.getText().trim();
  24. String number = phoneNumber.getText().trim();
  25. if(index < 0) { // add a new entry
  26. nameList.addElement(name);
  27. numberList.addElement(number);
  28. index = nameList.getSize()-1;
  29. }
  30. else { // update an existing entry
  31. nameList.set(index, name);
  32. numberList.set(index, number);
  33. }
  34. listView.setSelectedIndex(index);
  35. listView.ensureIndexIsVisible(index);
  36. }
  37. else if(source == newEntryMI) {
  38. listView.clearSelection();
  39. display(-1);
  40. }
  41. else if(source == searchMI) {
  42. String searchName = JOptionPane.showInputDialog(this,
  43. "Please enter a name (last first) to search:");
  44. System.out.println("Name to search: " + searchName);
  45. nameList.contains(searchName);
  46. return;
  47. }
  48. else if(source == sortMI) {
  49. lastName.getText();
  50. firstName.getText();
  51. }
  52. }

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

sh7euo9m

sh7euo9m1#

在类中使用copyinto方法 DefaultListModel ,以获取 nameList 作为一个数组。
在类中使用方法sort java.util.Arrays ,对数组进行排序。
创建新的 DefaultListModel 从排序的数组中。
设置模型 listView .

  1. Object[] objs = nameList.copyInto();
  2. Arrays.sort(objs, new Comparator<Object>() {
  3. @Override
  4. public int compare(Object o1, Object o2) {
  5. String s1 = o1 == null ? "" : o1.toString();
  6. String s2 = o2 == null ? "" : o2.toString();
  7. return s1.compareTo(s2);
  8. }
  9. });
  10. nameList = new DefaultListModel(objs);
  11. listView.setModel(nameList);

或者,您可以使用streamapi

  1. Object[] objs = nameList.copyInto();
  2. List<String> list = Arrays.stream(objs)
  3. .map(obj -> obj == null ? "" : obj.toString())
  4. .sorted()
  5. .collect(Collectors.toList());
  6. Vector<Object> v = new Vector<>(list);
  7. nameList = new DefaultListModel(v);
  8. listView.setModel(nameList);
展开查看全部

相关问题