簡體   English   中英

為什么選項的位置總是在變化?

[英]Why the place of the option always change?

我正在用 Java 做一個電話簿項目,在學校使用 MySql。 我想使用Class.getDeclaredMethods();打印方法Class.getDeclaredMethods(); 將它們添加到String類型的Vector中。 並調用一個menu()方法,該方法使用Scanner打印並接受用戶的選項,問題在於它總是更改方法的位置。 例如它可以打印 0.addPerson 1.deleteContact 2.searchByChar

和下一次 0.deleteContact 1.addPerson 2.searchByChar。

問題是我有一個 Switch 機箱依賴於它。 菜單功能:

public static int menu(Vector<?> options){
        System.out.println("The Options: ");
        for (int i = 0; i < options.size(); i++) {
            System.out.println(i + ". " + options.get(i));
        }
        Scanner scanner = new Scanner(System.in);
        System.out.println("Your Choice: ");
        String optionString = scanner.nextLine();
        int option = 0;
        if(isNumber(optionString)){
            option = Integer.valueOf(optionString);
        }else{
            System.out.println("Please Choose Valid Option");
            return menu(options);
        }
        return option;
    }

獲取我的方法的方法:

public static Vector<String> getClassMethods(Class whichClass){
        Method[] methods = whichClass.getDeclaredMethods();
        Vector<String> stringMethods = new Vector<>();
        for (Method method : methods) {
            if(Modifier.toString(method.getModifiers()).equals("protected")){
                stringMethods.add(method.getName());
            }
        }
        return stringMethods;
    }

我的班級連接到數據庫:

    private boolean getData(Person person){
    String sql = "SELECT * FROM " + DB_NAME + " WHERE name = '" + person.getName() + "' and phone_number = '" + person.getPhoneNumber() + "'";

    try {
        ResultSet resultSet = db.prepareStatement(sql).executeQuery();
        if (resultSet.next()) {
            return true;
        }
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
    return false;
}

protected void addPerson(){
    Person person = MyUtills.createPerson();
    if(getData(person)){
        System.out.println(person.getName() + ", " + person.getPhoneNumber() + ": Already in Contacts" );
    }else{
        add(person);
    }
}

private void add(Person person) {
    String pName = person.getName();
    String pPhone = person.getPhoneNumber();
    String pAddress = person.getAddress();

    String sql = "INSERT INTO " + DB_NAME + " (name,phone_number,address)" +
                "VALUES (?,?,?)";

    try {
        statement = db.prepareStatement(sql);
        statement.setString(1,pName);
        statement.setString(2,pPhone);
        statement.setString(3,pAddress);
        statement.execute();
        System.out.println("Added Successfully");
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

//delete contact by name
protected void deleteContact(){
    System.out.println("Enter Name Please");
    String name = MyUtills.readStringFromUser();
    Vector<Person> vector = checkMoreThanOne(name);
    if(vector.size() > 1){
        System.out.println("Choose One To Delete: ");
        int option = menu(vector);
        delete(vector.get(option));

    }
    System.out.println("Deleted");
}

private Vector<Person> checkMoreThanOne(String name) {
    Vector<Person> vector = new Vector<>();
    String sql = "SELECT * FROM " + DB_NAME;
    try {
        ResultSet resultSet = db.prepareStatement(sql).executeQuery();
        while(resultSet.next()){
            String pName = resultSet.getString("name");
            String pPhone = resultSet.getString("phone_number");
            String pAddress = resultSet.getString("address");
            if(pName.equals(name)){
                vector.add(new Person(pName,pPhone,pAddress));
            }
        }
        return vector;
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}


//deleting and existing contact;
private void delete(Person person){
    String sql = "DELETE FROM " + DB_NAME + " WHERE name = '" + person.getName() + "' and phone_number = '" + person.getPhoneNumber() + "'";
    try {
        statement = db.prepareStatement(sql);
        statement.execute();
        System.out.println("Deleted Successfully");
    } catch (SQLException e) {
        e.printStackTrace();
    }
}


//creating a new table for empty data base!
private void createTable() {
    try {
        statement = db.prepareStatement(SQL_TABLE_STRING);
        statement.execute();
    } catch (SQLException e) {
        e.printStackTrace();
    }

}

protected void searchByFirstChar(Character character){
    Vector<Person> personVector = new Vector<>();
    String sql = "SELECT * FROM newphonebook";

    try {
        ResultSet resultSet = db.prepareStatement(sql).executeQuery();
        while(resultSet.next()){
            String name = resultSet.getString("name");
            String phoneNum = resultSet.getString("phone_number");
            String address = resultSet.getString("address");
            if(character.equals(name.charAt(0))){
                personVector.add(new Person(name,phoneNum,address));
            }
        }
        System.out.println(personVector);
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    }
}

public void getOptions(){
    Vector<String> options = MyUtills.getClassMethods(DBWriterReader.class);
    int option = MyUtills.menu(options);
    switch (option){
        case 0:
            addPerson();
            break;
        case 1:
             deleteContact();
            break;
        case 2:
//                searchByFirstChar();
                break;
        }
    }

}

我知道這不是最好的寫法,但我正在努力使其更好 數據庫中的寫入和讀取工作正常,它打印我的方法的方式導致問題..

如果您需要保證數據結構中元素的順序,則不要使用 Vector —— 現在已經不是 1999 年了。 查看Vector的文檔。 您按照迭代器確定的順序獲取元素,而不是按照它們的存儲順序。

將您的數據結構更改為ArrayList ,以保證順序。 在像您這樣的單線程應用程序中,ArrayList 的性能也更高,因為與 Vector 不同,ArrayList 跳過了與同步相關的開銷。 使用 ArrayList 元素的索引還可以簡化構造 switch 語句的方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM