【问题标题】:Retrieving a certain array index in an array of objects using a known attribute?使用已知属性检索对象数组中的某个数组索引?
【发布时间】:2017-12-30 10:09:42
【问题描述】:

以下是我的程序的一些背景:
为了上课,我正在制作一个虚假的登录系统。
它使用一组对象,每个对象都分配了属性。
当我尝试检索用户名/密码对的对象索引时,似乎出现问题。
我想要这个索引号,这样我就可以在用户“登录”时对他们做更多的事情。
但是,无论用户名密码对如何,获取正确的密码对都存在问题。

以下是我尝试检索它的方式:

static int getIndex(User[] users, int index, String userID, String userPin)
{
    for (int i = 0; i < users.length; ++i) 
    {
     if (users[i].getUserID().equals(userID) && users[i].getPassword().equals(userPin)); 
        {
        System.out.print(i);
        index = i;
        }
    }
return index;

}
}

我在打印语句中添加了以查看它在做什么。
它打印

012

并将最后一个数字(在本例中为 2)发送到要使用的方法之外。 或者,如果我告诉它在 if 块内返回,无论我使用什么用户名,它都会返回 0。

我还在这个网站上四处寻找其他解决方案,除了一些使用数组列表之外,它们似乎都与我正在尝试做的非常相似。我不确定我哪里出错了。
如果可能,我想将我的对象数组保留为对象数组,或者如果确实需要更改,我可能会来回快速转换。

最终,我希望能够根据输入的用户名和密码获取索引(0、1 或 2)并将其返回以用作其他地方的索引。

下面是其余的代码,它也有一个类可以使用,但我不想用代码轰炸人们。

import java.util.Scanner;
public static void main(String[] args) {
    User[] users = new User[3];
    users[0] = new User();
    users[1] = new User();
    users[2] = new User();

    users[0].setFirstname("Matt");
    users[0].setLastname("Miller");
    users[0].setUserID("aaa");
    users[0].setPassword("111");

    users[1].setFirstname("Susie");
    users[1].setLastname("Smith");
    users[1].setUserID("bbb");
    users[1].setPassword("222");

    users[2].setFirstname("Joe");
    users[2].setLastname("Jones");
    users[2].setUserID("ccc");
    users[2].setPassword("333");

Scanner userInput = new Scanner(System.in);
System.out.println("Enter your user ID");
String userID = userInput.nextLine();
System.out.println("Enter your PIN");
String userPin= userInput.nextLine();
int Index = 0;

Index = getIndex(users, Index, userID, userPin);
System.out.printf("Welcome %s %s\n\n", users[Index].getFirstname(), users[Index].getLastname());
}

感谢您的帮助!

【问题讨论】:

    标签: java arrays object indexing attributes


    【解决方案1】:

    我可以看到您的代码中有两个错误。

    1. 在 getIndex(...) 方法中你已经把 ; (半栏)如果之后。
    2. 您在 if 条件下使用了“username”而不是“userID”。

    这会解决你的问题。

    【讨论】:

      【解决方案2】:

      我们知道分号用于终止语句。正如上面的答案所指出的,您在 getIndex() 方法的 if 块末尾放置了一个分号。

       if (users[i].getUserID().equals(userID) && users[i].getPassword().equals(userPin)); 
      //Remove the semicolon.
              {
              System.out.print(i);
              index = i;
              }
      

      如果你在 if 块的末尾加上一个分号,那么 if 块就变得无效了。它什么也不做。什么都不做的语句称为空语句。 请参阅下面给出的链接。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html

      如果您调试过它,您很容易发现问题。我还建议您使用像 FindBugs 这样的静态代码分析器。它会扫描您的文件,并且大部分时间会告诉您问题所在。

      【讨论】:

        【解决方案3】:

        为了避免错误,您可以使用的一种方法是让 java 为您完成工作!这意味着您的编程错误被最小化,因为您不必担心创建 java 的逻辑语言可以处理得更好。

        让我们这样做。

        1. 尝试使用构造函数,这将有助于减轻错误并避免大量代码行,例如:

        而不是 4 行

        users[0].setFirstname("Matt");
        users[0].setLastname("Miller");
        users[0].setUserID("aaa");
        users[0].setPassword("111");
        

        更好的方式 1 行,意味着更少的错误

        users[0]=ew User("Matt","Miller","aaa","111")
        
        1. 如果解决方案的目标是知道什么是数组,那没关系,但是当代码变得更复杂并且对元素分组或通过其他值查找的新要求时,数组将成为一场噩梦。总是尝试使用集合!

        用户元素将以更好的方式组织起来,以非常简单的方式进行更多操作。

        这是在列表中创建的用户元素,同样,更少的代码,更少的错误

        List<User> userList = Arrays.asList(
                new User("Matt","Miller","aaa","111"),
                new User("Susie","Smith","bbb","222"),
                new User("Joe","Jones","ccc","333")
        );
        
        1. 现在程序不起作用的原因,分号! (;),它一直在发生,包括专业开发人员。

        让我们避免错误,再次使用更少的代码。而这次使用 lambdas,所以让 java 来完成这项工作,避免 for 循环,所以如果您需要查找列表中的元素,有非常强大的工具,包括流、过​​滤器、收集、映射等。

        这个例程也以与 getIndex 方法相同的方式找到用户,但以一种非常有效的方式,这意味着打字错误的可能性降低了,因为它是 java 语言在做这项工作。

        userFound = userList.stream()
                        .filter(s -> s.getUserID().equals(userID) && s.getPassword().equals(userPin))
                        .findFirst();
        
        1. 现在下面的示例对程序进行了一些修改,并列出了一些建议,以减少工作量并避免错误,希望对您有所帮助。

        应用程序

        public class Application {
        
            public static void main(String[] args) {
                List<User> userList = Arrays.asList(
                        new User("Matt","Miller","aaa","111"),
                        new User("Susie","Smith","bbb","222"),
                        new User("Joe","Jones","ccc","333")
                );
        
                Optional<User> userFound = null;
        
                String outputMessage = "";
        
                Scanner userInput = new Scanner(System.in);
                System.out.println("Enter your user ID");
                final String userID = userInput.nextLine();
                System.out.println("Enter your PIN");
                final String userPin= userInput.nextLine();
        
                userFound = userList.stream()
                        .filter(s -> s.getUserID().equals(userID) && s.getPassword().equals(userPin))
                        .findFirst();
        
                outputMessage = userFound.isPresent()? String.format("Welcome %s %s\n\n", userFound.get().getFirstname(), userFound.get().getLastname()):"No user found!";
        
                System.out.println(outputMessage);
            }}
        

        用户类

        class User {
            private String firstname;
            private String lastname;
            private String userID;
        
            public User(String firstname, String lastname, String userID, String password) {
                this.firstname = firstname;
                this.lastname = lastname;
                this.userID = userID;
                this.password = password;
            }
        
            private String password;
        
            public String getFirstname() {
                return firstname;
            }
        
            public void setFirstname(String firstname) {
                this.firstname = firstname;
            }
        
            public String getLastname() {
                return lastname;
            }
        
            public void setLastname(String lastname) {
                this.lastname = lastname;
            }
        
            public String getUserID() {
                return userID;
            }
        
            public void setUserID(String userID) {
                this.userID = userID;
            }
        
            public String getPassword() {
                return password;
            }
        
            public void setPassword(String password) {
                this.password = password;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2013-09-03
          • 2015-07-04
          • 2020-05-21
          • 1970-01-01
          • 2018-11-25
          • 2021-07-24
          • 2013-02-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多