java - 为什么选项的位置总是改变?

标签 java mysql database methods

我正在用 Java 做一个电话簿项目,在学校使用 MySql。 我想使用 Class.getDeclaredMethods(); 打印方法 将它们添加到 String 类型的 Vector 中。 并调用 menu() 方法,该方法使用 Scanner 打印并接受用户的选项 问题是它总是改变方法的位置。 例如它可以打印 0.addPerson 1.删​​除联系人 2.按字符搜索

还有下一次 0.删除联系人 1.添加人员 2.按字符搜索。

问题是我有一个 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;
    }

我的类(class)连接到数据库:

    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 语句的方式。

关于java - 为什么选项的位置总是改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59238266/

相关文章:

java - android 获取URL路径

java - Java SE 中 javax.annotation 包中的注释

java - 标签二维数组 | JavaFX

mysql - 非常相似的 MySQL 查询结果显着不同的查询持续时间(WHERE on timespans)

mysql - Toad 中时间戳类型列的默认值无效

mysql - 在 MySQL 中运行查询触发器时出错

java - 使用相同参数的不同调用会产生不同的 LocalDateTime 结果

php - SQL 选择具有相似标签的帖子

sql-server - MS SQLServer 能否在两个集群之间建立数据库镜像

sql-server - 如何创建需要两个外键之一的表?