2013-04-24 283 views
-1

我是Java初學者。我需要按字母順序排列一串名稱。字符串不是由用戶提交的,而是從帶有名字,姓氏和電話號碼列表的文件中讀取的。我也很難得到刪除功能的工作。任何幫助將不勝感激。按字母順序排序字符串

見下面我的代碼:

import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import javax.swing.JOptionPane; 

public class PhoneBook extends Frame implements ActionListener, ItemListener { 

    MenuItem newMI, openMI, saveMI, saveAsMI, exitMI; 
    MenuItem searchMI, deleteMI, updateMI, newEntryMI, sortMI; 
    String fileName; 
    List nameList, numberList; 
    TextField lastName, firstName, phoneNumber; 

    /** 
    * Constructor 
    */ 
    public PhoneBook() { 
     super("White Pages"); // set frame title 
     setLayout(new BorderLayout()); // set layout 

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

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

     // create phone list and controls 
     Panel listPanel = new Panel(new BorderLayout()); 
     add(listPanel, BorderLayout.CENTER); 
     Label label = new Label("Name List", Label.LEFT); 
     listPanel.add(label, BorderLayout.NORTH); 
     nameList = new List(); 
     nameList.addItemListener(this); 
     numberList = new List(); 
     listPanel.add(nameList, BorderLayout.CENTER); 
     Panel panel = new Panel(new BorderLayout()); 
     add(panel, BorderLayout.WEST); 
     Panel editPanel = new Panel(new GridLayout(6, 1)); 
     panel.add(editPanel, BorderLayout.NORTH); 
     label = new Label("Last Name", Label.LEFT); 
     editPanel.add(label); 
     lastName = new TextField(); 
     editPanel.add(lastName); 
     label = new Label("First Name", Label.LEFT); 
     editPanel.add(label); 
     firstName = new TextField(); 
     editPanel.add(firstName); 
     label = new Label("Phone Number", Label.LEFT); 
     editPanel.add(label); 
     phoneNumber = new TextField(); 
     editPanel.add(phoneNumber); 
    } 

    // implementing ActionListener 
    public void actionPerformed(ActionEvent event) { 
     Object source = event.getSource(); 
     if (source == newMI) { 
      nameList.removeAll(); 
      numberList.removeAll(); 
      fileName = null; 
      display(-1); 
      setTitle("White Pages"); // reset frame title 
     } else if (source == openMI) { 
      doOpen(); 
     } else if (source == exitMI) { 
      System.exit(0); 
     } else if (source == updateMI) { 
      int index = nameList.getSelectedIndex(); 
      String name = lastName.getText().trim() + " " 
        + firstName.getText().trim(); 
      String number = phoneNumber.getText().trim(); 
      if (index < 0) { // add a new entry 
       nameList.add(name); 
       numberList.add(number); 
       nameList.select(nameList.getItemCount() - 1); 
      } else { // update an existing entry 
       nameList.replaceItem(name, index); 
       numberList.replaceItem(number, index); 
       nameList.select(index); 
      } 
     } else if (source == newEntryMI) { 
      nameList.select(-1); 
      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); 
     } 
    } 

    /** 
    * Implementing ItemListener to display the selected entry 
    */ 
    public void itemStateChanged(ItemEvent event) { 
     display(nameList.getSelectedIndex()); 
    } 

    /** 
    * method to specify and open a file 
    */ 
    private void doOpen() { 
     // display file selection dialog 
     FileDialog fDialog = new FileDialog(this, "Open ...", FileDialog.LOAD); 
     fDialog.setVisible(true); 
     // Get the file name chosen by the user 
     String file = fDialog.getFile(); 
     // If user canceled file selection, return without doing anything. 
     if (file == null) 
      return; 
     fileName = fDialog.getDirectory() + file; 

     // Try to create a file reader from the chosen file. 
     FileReader reader; 
     try { 
      reader = new FileReader(fileName); 
     } catch (FileNotFoundException ex) { 
      JOptionPane.showMessageDialog(this, "File Not Found: " + fileName, 
        "Error", JOptionPane.ERROR_MESSAGE); 
      doOpen(); 
      return; 
     } 
     BufferedReader bReader = new BufferedReader(reader); 
     // remove items from before if any 
     nameList.removeAll(); 
     numberList.removeAll(); 
     // Try to read from the input file one line at a time. 
     try { 
      int index; 
      String name, number; 
      String textLine = bReader.readLine(); 
      while (textLine != null) { 
       index = textLine.indexOf((int) ','); 
       if (index > 0) { 
        name = textLine.substring(0, index); 
        number = textLine.substring(index + 1); 
        nameList.add(name.trim()); 
        numberList.add(number.trim()); 
       } 
       textLine = bReader.readLine(); 
      } 
      bReader.close(); 
      reader.close(); 
     } catch (IOException ioe) { 
      JOptionPane.showMessageDialog(this, 
        "Error reading file: " + ioe.toString(), "Error", 
        JOptionPane.ERROR_MESSAGE); 
      return; 
     } 
     setTitle("White Pages: " + file); // reset frame title 
     nameList.select(0); 
     display(0); 
    } 

    /** 
    * method to display the current entry 
    */ 
    private void display(int index) { 
     if (index < 0) { 
      lastName.setText(""); 
      firstName.setText(""); 
      phoneNumber.setText(""); 
     } else { 
      String name = nameList.getItem(index); 
      int space = name.indexOf((int) ' '); 
      lastName.setText(name.substring(0, space)); 
      firstName.setText(name.substring(space + 1)); 
      phoneNumber.setText(numberList.getItem(index)); 
     } 
    } 

    /** 
    * the main method 
    */ 
    public static void main(String[] argv) { 
     // create frame 
     System.out.println("Creating window ... "); 
     PhoneBook frame = new PhoneBook(); 
     Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); 
     frame.setSize(size.width/2, size.height/2); 
     frame.setLocation(100, 100); 

     System.out.println("Your Screen Size: " + size.width + " (width) x " 
       + size.height + " (height)"); 

     // add window closing listener 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 

     // show the frame 
     frame.setVisible(true); 
    } 
} 
+0

http://stackoverflow.com/questions/12681103/java-alphabetizing-strings – Apurv 2013-04-24 05:20:20

+0

首先。你如何建議排序字符串?您需要先將每個人的文件結果分開。 – Aquillo 2013-04-24 05:20:28

+1

「*你如何排序」*如果這是問題,請參閱[所以,你需要編寫一個程序,但不知道如何開始](http://www.patriciashanahan.com/beginner.html) 。 – 2013-04-24 05:20:47

回答

0

這裏是排序和刪除的更新:

import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.util.Arrays; 
import javax.swing.JOptionPane; 

public class PhoneBook extends Frame implements ActionListener, ItemListener { 

    private static final long serialVersionUID = 1L; 
    MenuItem newMI, openMI, saveMI, saveAsMI, exitMI; 
    MenuItem searchMI, deleteMI, updateMI, newEntryMI, sortMI; 
    String fileName; 
    // firstname, lastname and phonenumber are all combined now 
    List entries; 
    TextField lastName, firstName, phoneNumber; 

    /** 
    * Constructor 
    */ 
    public PhoneBook() { 
     super("White Pages"); // set frame title 
     setLayout(new BorderLayout()); // set layout 

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

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

     // create phone list and controls 
     Panel listPanel = new Panel(new BorderLayout()); 
     add(listPanel, BorderLayout.CENTER); 
     Label label = new Label("Name List", Label.LEFT); 
     listPanel.add(label, BorderLayout.NORTH); 
     entries = new List(); 
     entries.addItemListener(this); 
     listPanel.add(entries, BorderLayout.CENTER); 
     Panel panel = new Panel(new BorderLayout()); 
     add(panel, BorderLayout.WEST); 
     Panel editPanel = new Panel(new GridLayout(6, 1)); 
     panel.add(editPanel, BorderLayout.NORTH); 
     label = new Label("Last Name", Label.LEFT); 
     editPanel.add(label); 
     lastName = new TextField(); 
     editPanel.add(lastName); 
     label = new Label("First Name", Label.LEFT); 
     editPanel.add(label); 
     firstName = new TextField(); 
     editPanel.add(firstName); 
     label = new Label("Phone Number", Label.LEFT); 
     editPanel.add(label); 
     phoneNumber = new TextField(); 
     editPanel.add(phoneNumber); 
    } 

    // implementing ActionListener 
    public void actionPerformed(ActionEvent event) { 
     Object source = event.getSource(); 
     if (source == newMI) { 
      entries.removeAll(); 
      fileName = null; 
      display(-1); 
      setTitle("White Pages"); // reset frame title 
     } else if (source == openMI) { 
      doOpen(); 
     } else if (source == exitMI) { 
      System.exit(0); 
     } else if (source == updateMI) { 
      int index = entries.getSelectedIndex(); 
      // combine fields into one entry 
      String entry = String.format("%s %s %s", lastName.getText().trim(), 
        firstName.getText().trim(), phoneNumber.getText().trim()); 
      if (index < 0) { 
       // add a new entry 
       entries.add(entry); 
       entries.select(entries.getItemCount() - 1); 
      } else { 
       // update an existing entry 
       entries.replaceItem(entry, index); 
       entries.select(index); 
      } 
     } else if (source == newEntryMI) { 
      entries.select(-1); 
      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); 
     } else if (source == deleteMI) { 
      // just delete the selected entry 
      int index = entries.getSelectedIndex(); 
      if (index >= 0) { 
       entries.remove(index); 
      } 
     } else if (source == sortMI) { 
      String[] sortedEntries = entries.getItems(); 
      Arrays.sort(sortedEntries); 
      entries.removeAll(); 
      for (String entry : sortedEntries) { 
       entries.add(entry); 
      } 
     } 
    } 

    /** 
    * Implementing ItemListener to display the selected entry 
    */ 
    public void itemStateChanged(ItemEvent event) { 
     display(entries.getSelectedIndex()); 
    } 

    /** 
    * method to specify and open a file 
    */ 
    private void doOpen() { 
     // display file selection dialog 
     FileDialog fDialog = new FileDialog(this, "Open ...", FileDialog.LOAD); 
     fDialog.setVisible(true); 
     // Get the file name chosen by the user 
     String file = fDialog.getFile(); 
     // If user canceled file selection, return without doing anything. 
     if (file == null) 
      return; 
     fileName = fDialog.getDirectory() + file; 

     // Try to create a file reader from the chosen file. 
     FileReader reader; 
     try { 
      reader = new FileReader(fileName); 
     } catch (FileNotFoundException ex) { 
      JOptionPane.showMessageDialog(this, "File Not Found: " + fileName, 
        "Error", JOptionPane.ERROR_MESSAGE); 
      doOpen(); 
      return; 
     } 
     BufferedReader bReader = new BufferedReader(reader); 
     // remove items from before if any 
     entries.removeAll(); 
     // Try to read from the input file one line at a time. 
     try { 
      int index; 
      String textLine = bReader.readLine(); 
      while (textLine != null) { 
       index = textLine.indexOf((int) ','); 
       if (index > 0) { 
        String name = textLine.substring(0, index); 
        String number = textLine.substring(index + 1); 
        entries.add(String.format("%s %s", name.trim(), 
          number.trim())); 
       } 
       textLine = bReader.readLine(); 
      } 
      bReader.close(); 
      reader.close(); 
     } catch (IOException ioe) { 
      JOptionPane.showMessageDialog(this, 
        "Error reading file: " + ioe.toString(), "Error", 
        JOptionPane.ERROR_MESSAGE); 
      return; 
     } 
     setTitle("White Pages: " + file); // reset frame title 
     entries.select(0); 
     display(0); 
    } 

    /** 
    * method to display the current entry 
    */ 
    private void display(int index) { 
     if (index < 0) { 
      lastName.setText(""); 
      firstName.setText(""); 
      phoneNumber.setText(""); 
     } else { 
      // use a regular expression and the split method to 
      // split the entry on comma or whitespace 
      String[] fields = entries.getItem(index).split("(,|\\s)"); 
      if (fields.length > 0) { 
       lastName.setText(fields[0]); 
      } 
      if (fields.length > 1) { 
       firstName.setText(fields[1]); 
      } 
      if (fields.length > 2) { 
       phoneNumber.setText(fields[2]); 
      } 
     } 
    } 

    /** 
    * the main method 
    */ 
    public static void main(String[] argv) { 
     // create frame 
     System.out.println("Creating window ... "); 
     PhoneBook frame = new PhoneBook(); 
     Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); 
     frame.setSize(size.width/2, size.height/2); 
     frame.setLocation(100, 100); 

     System.out.println("Your Screen Size: " + size.width + " (width) x " 
       + size.height + " (height)"); 

     // add window closing listener 
     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 

     // show the frame 
     frame.setVisible(true); 
    } 
} 
+0

非常感謝你給我一個開始!我完全不能夠感謝你,代碼是在做它想象中的東西,我只能解決一些小問題。比如當用戶選擇一個人時,他們的姓名假設2b按姓氏,名字,電話排列,當刪除它時,假設2消失,並且下面或上面的名稱假設填寫。我將繼續努力,因爲你給了我幾乎所有的東西!謝謝 – MassiveCoding 2013-04-24 17:52:28

+0

如果你對這個答案感到滿意,你應該接受它。 – 2013-04-24 18:18:18

0
  1. 添加名稱列表。
  2. 使用Collections類的排序方法對列表進行排序。
+0

@AndriannaKoster,我知道它的工作原理,因爲我真的希望它能夠工作!再次感謝!問題已解決 – MassiveCoding 2013-04-24 18:15:35

2

爲每一行數據創建一個自定義對象。將對象添加到列表中,然後對列表進行排序。

請參閱:https://stackoverflow.com/a/1947527/131872查看示例如何使用Comparable或Comparator進行排序。

+0

@ SimonC我已經包含了我的實際程序 – MassiveCoding 2013-04-24 05:50:46

+0

@Aquillo,我編輯了我的問題 – MassiveCoding 2013-04-24 05:52:09

+0

我沒有看到您讀取數據的代碼,並創建了要添加到您的列表中的自定義對象。不要期望我們爲您編寫代碼。我給了你一個工作例子,你只需要稍微修改一下。 – camickr 2013-04-24 15:40:04