【问题标题】:Better way to display information from an ArrayList using a toString and Enhanced for loop使用 toString 和增强的 for 循环显示来自 ArrayList 的信息的更好方法
【发布时间】:2018-04-22 21:46:17
【问题描述】:

我希望能够使用Contact 类的ContactArrayList 显示联系人列表中的信息。

我有一个 ContactArrayList 类,其中包含一个 Contact 类对象。在ContactArrayList 类中,我有一个addremovesizeisEmpty 等。该类的方法将用于ContactArrayList 类中的ContactArrayList 以及其他方法。

在我的主/驱动程序类中,我有一个 ContactArrayList 类的对象,并创建了一个“用户”对象和几个 Contact 类的“罐头”对象。

我的问题:

当用户选择显示所有联系人的信息时,包括罐头对象和用户对象,我尝试使用增强的 for 循环 W/ContactArrayList 类的 toString 方法,但因为我使用的是增强的当我想使用ContactArrayListtoString 时,for 循环使用Contact 类“迭代器”变量来遍历并显示它使用Contact toString 的信息。

ContactArrayList:

import java.util.ArrayList;

public class ContactArrayList 
{  
    ArrayList <Contact> contactArray = new ArrayList <Contact> ();

    String toStringM = " ";

    public Contact set(int index, Contact element)
    {    
         return contactArray.set(index, element);
    }

    public Boolean add(Contact element)
    {    
         return contactArray.add(element);
    }

    public Contact remove(int index)
    {    
         return contactArray.remove(index);
    }

    public int size()
    {    
         return contactArray.size();
    }

    public void clear()
    {    
          contactArray.clear();
    }

    public boolean isEmpty()
    {    

         return contactArray.isEmpty();
    }

    @Override
    public String toString()
    {
        for(int i = 0; i < contactArray.size(); i++)
        {
           toStringM = "Displaying all contacts and information: "
            + contactArray.get(i).getName() +
            contactArray.get(i).getLastName() +
            contactArray.get(i).getPhoneNumber()+
            contactArray.get(i).getEmailAddress();     
        }

      return toStringM;

    }

    public void sort()
    {
        ArrayList <Contact> tempSort = new ArrayList <> ();

        while(!contactArray.isEmpty())
        {
            int index = 0;
            for (int i = 1; i < contactArray.size(); i++)
            {
                if(contactArray.get(i).compareTo(contactArray.get(index)) == -1)
                 {
                    index = i; 
                 }
            }  

            tempSort.add(contactArray.get(index));

            contactArray.remove(index);
        }

        contactArray = tempSort; 
    }

    public void addContact(String passedString)
    {
        ArrayList <Contact> addContact = new ArrayList <Contact> ();

       for(Contact c : contactArray)
       {
          if (c.getName().indexOf(passedString) > -1)
          {
                  addContact.add(c);
          }
       }


    }

    public void searchAndRemove (String passedString)
    {          
       for(int i = 0; i < contactArray.size(); i++)
       {
          if (contactArray.get(i).getName().indexOf(passedString) > -1)
          {
                 contactArray.remove(i);
          }
       }

    }

}

Main:

import java.util.ArrayList;
import java.util.Scanner;

public class HomeWork10 {

    public static void main(String[] args)
    {
        userInput();
    }

    public static void userInput()
    {
        Scanner in = new Scanner(System.in);
        ContactArrayList   cal1 = new ContactArrayList ();
        Contact c1 = new Contact(); //User Input Object

        //"Canned" refernce Objects
        Contact c2 = new Contact("James", "Conney", "7608949843",
                                 "jamesConney@seeMe.com");
        Contact c3 = new Contact("JJ", "Jim", "7608939836",
                                 "theStuff@gmail.com");
        Contact c4 = new Contact("Jimmer", "ConBoy", "7608040500", 
                                 "jimConBoy@seeMe.com");
        //Adding canned objects to the ArrayList
        cal1.add(c2);
        cal1.add(c3);
        cal1.add(c4);

        String name = " ";
        String lastName = " ";
        String phoneNumber = " ";
        String emailAddress = " ";
        String yesOrNo = " ";
        int userInput = 0;
        boolean userContinues = true;

        do
        {
            System.out.println("Please enter 1, 2, 3, 4, or 5 for the following"
                               + " options"); 
            System.out.println("1. Add a new Contact, 2. display all contacts, "
                              + "3. search for a contact and remove them,"
                              + " 4. Sort the Contact LIST by name, 5. Quit: ");
            userInput = in.nextInt();
            in.nextLine();
            switch(userInput)
            {

                case 1: 

                        System.out.println("Please enter the new contact info"
                                 + "(Name, lastName, phoneNumber and emailAddress): ");
                       name = in.nextLine();
                       lastName = in.nextLine();
                       phoneNumber = in.nextLine();
                       emailAddress = in.nextLine();

                       c1 = new Contact(name, lastName, phoneNumber, emailAddress);
                       cal1.add(c1); 
                       break;
                case 2:

                    System.out.println(cal1.toString());
                    break; 

                case 3: 
                    System.out.println("Enter a contact to search for and remove: ");

                    name = in.nextLine();                
                    cal1.searchAndRemove(name);
                    break;

                case 4:   
                    System.out.println("Sorting the contact list by name "
                                       + "and displaying it to the screen.");
                    cal1.sort();
                    System.out.println(cal1.toString());


                    break;

                case 5: 
                    System.out.println("Goodbye");
                    System.exit(0);
                       break;

                default:
                    System.out.println("Invalid entry, try again.");

                    break;
           }

                System.out.println("Would you like to continue ? (Y/N): ");
                yesOrNo = in.next();

                if(yesOrNo.equalsIgnoreCase("Y"))
                {
                    System.out.println("");
                }
                else
                {
                    System.out.println("Goodbye");
                    userContinues = false;
                }


        }while(userContinues);



    }

}

Contact:

import java.util.Scanner;

public class Contact implements Comparable
{

    private static String name = " ";

    private static String lastName = " ";
    private static String phoneNumber = " ";
    private static String emailAddress = " ";

    public Contact()
    {
        //Default constructor
    }

    public Contact(String passedName, String passedLastName, 
                   String passedPhoneNumber, String passedEmailAddress)
    {
        this.name = passedName;
        this.lastName = passedLastName;
        this.phoneNumber = passedPhoneNumber;
        this.emailAddress = passedEmailAddress;
    }

    //Setter Methods
    public void setName(String passedName)
    {
        this.name = passedName;
    }
    public void setLastName(String passedLastName)
    {
         this.lastName = passedLastName;
    }
    public void setPhoneNumber(String passedPhoneNumber)
    {
        this.phoneNumber = passedPhoneNumber;
    }
    public void setEmailAddress(String passedEmailAddress)
    {
        this.emailAddress = passedEmailAddress;
    }
    //Getter Methods

    public String getName()
    {
        return this.name;
    }
    public String getLastName()
    {
        return this.lastName;
    }
    public String getPhoneNumber()
    {
        return this.phoneNumber;
    }
    public String getEmailAddress()
    {
        return this.emailAddress;
    }
    //Methods

    public String toString()
    {
        return "Name, Last name, phone number, and email in order: " 
             + this.name +" " + this.lastName + " " + this.phoneNumber + 
             " " + this.emailAddress;
    }


    public int compareTo(Object other)
    {
        Contact passedContact = (Contact) other;
        if(this.lastName.compareTo(passedContact.lastName) == 0)
        {
             return this.name.compareTo(passedContact.name);
        }
        else
        {
            return this.lastName.compareTo(passedContact.lastName);
        }

    }

    public static String userInput()
    {
        Scanner in = new Scanner(System.in);
        System.out.println("Please enter your name, last name,"
                           + " phone number, and email address: ");
        Contact.name = in.nextLine();
        Contact.lastName = in.nextLine();
        Contact.phoneNumber= in.nextLine();
        Contact.emailAddress = in.nextLine();

        Contact newContact = new Contact(name, lastName, phoneNumber, emailAddress);

        return newContact.getName() + newContact.getLastName() +
               newContact.getPhoneNumber() + newContact.getEmailAddress();

    }

     public boolean equals(Object anObject)
    {
    //equals method which trys to check if the object to be ,ade is legdible
        if (anObject == null || getClass() != anObject.getClass())
        {
            return false ;
        }
        Contact otherContact = (Contact) anObject ;

        return (this.name.equals(otherContact.getName())) &&
                this.lastName.equals(otherContact.getLastName()) &&
                this.phoneNumber.equals(otherContact.getPhoneNumber()) &&
                this.emailAddress.equals(otherContact.getEmailAddress());
    }         
}

输出:

Please enter 1, 2, 3, 4, or 5 for the following options
1. Add a new Contact, 2. display all contacts, 3. search for a contact and remove them, 4. Sort the Contact LIST by name, 5. Quit: 

1
Please enter the new contact info(Name, lastName, phoneNumber and emailAddress): 
Mike

Dim

123456789

email

Would you like to continue ? (Y/N): 
y

Please enter 1, 2, 3, 4, or 5 for the following options

1. Add a new Contact, 2. display all contacts, 3. search for a contact and remove them, 4. Sort the Contact LIST by name, 5. Quit: 

2
Name, Last name, phone number, and email in order: Mike Dim 123456789 email

Name, Last name, phone number, and email in order: Mike Dim 123456789 email

Name, Last name, phone number, and email in order: Mike Dim 123456789 email

Name, Last name, phone number, and email in order: Mike Dim 123456789 email

Would you like to continue ? (Y/N):

总的来说,我会继续解决这个问题,它可能很简单,但希望有人指出显而易见的事情。如果您需要更多有关 ContactArrayList 类、Contact 类或 Main/driver 类的信息,请告诉我!

【问题讨论】:

  • 能否请您出示ArrayList 类的完整代码?
  • 我无法重现该问题..我认为缺少一些重要的代码..您要添加Main 的其余部分吗?也许Contact 也是?

标签: java for-loop arraylist


【解决方案1】:

感谢您提供缺失的课程。 问题在于你的Contact 类:

private static String name = " ";
private static String lastName = " ";
private static String phoneNumber = " ";
private static String emailAddress = " ";

这些变量都是static,这意味着它们不是每个Contact 存在一次,而是每个应用程序存在一次。所以所有Contacts 将共享相同的namelastName 等。

如果您删除 static 修饰符,它应该可以工作。

但是您的代码中还有一些我想解决的其他问题:

  1. 不要这样称呼你的ContactArrayList。其他开发人员会查看它并期望它扩展ArrayList,但它没有。只需将其命名为 Contacts,这样会更好(我将在此处如此称呼它)。
  2. 您不应使用toString 来显示用户可读的文本。它旨在为调试目的输出文本。将您的 toString 方法替换为以下内容:

    1. Contact:

      public String toReadableString() {
          return "Name: " + this.name + " " + this.lastName + ", phone number: " + phoneNumber + ", email: " + this.emailAddress;
      }
      
    2. 不要打电话给你的ArrayList&lt;Contact&gt;contactArray。它不是一个数组。称它为members..

    3. Contacts -> 你的toString 方法被破坏了。您刚刚将每个 Contact 的结果存储在同一个 toStringM 中(也是一个坏名字。我不知道这应该是什么意思)

          public String toReadableString()
          {
              String result = "Displaying all contacts and information:";
              for (Contact contact : members) {
                  result += "\n\t" + contact.toReadableString();
              }
              return result;
          }
      
    4. 您的addContact(String passedString) 方法已损坏。我不知道它应该做什么,但它只会创建一个新的ArrayList,你永远不会对它做任何事情。
    5. 请将.indexOf(passedString) &gt; -1 替换为.contains(passedString)。它可能做同样的事情,但更容易阅读。
    6. 我不太确定Contact 中的方法public static String userInput() 应该做什么。看起来你可以摆脱它。
    7. 您对Contact extends Comparable 的继承错误。应该是Contact extends Comparable&lt;Contact&gt;

    8. 您的compareTo 方法无法正常工作。将其替换为以下内容:

      @Override
      public int compareTo(Contact other) {
          if (this.lastName.compareTo(other.lastName) == 0) {
              return this.name.compareTo(other.name);
          } else {
              return this.lastName.compareTo(other.lastName);
          }
      }
      
    9. Collections.sort(members); 替换您的sort 方法(您可以这样做,因为Contact 现在是正确的Comparable&lt;Contact&gt;

【讨论】:

  • 好的,谢谢伙计,我非常感谢所有的帮助!我明白了,未来所有人都希望给出更好的描述性名称。至于 addContact 方法,它应该是“添加”一个联系人对象到联系人列表的“成员”。我也会跟进其他更改!
【解决方案2】:

toString() 方法是 java 用于生成 Strings 供开发人员调试的。我建议要么实现你自己的toReadableString(),要么简单地定义你想如何在现场渲染它。 Java 8 有一些很好的功能可以做到这一点:

case 2:
    String s = contacts.stream()
            .map(c -> Stream.of(c.getName(), c.getLastName(), c.getPhoneNumber(), c.getEmailAddress())
                    .collect(Collectors.joining(", ")))
            .collect(Collectors.joining("\n\t", "Displaying all contacts and information:\n\t", ""));
    System.out.println(s);
    break; 

首先我们从contacts 创建一个Stream。然后我们将Contacts 的Stream 转换为Strings 的Streammap。我们再次创建四个值的Stream,并将它们与, 连接起来。这第二个Stream 将创建每个联系人。

然后我们回到外部Stream,现在我们有一个Stream 可读联系人。我们也加入它们,用"\n\t" 分隔它们,从而创建一个String,如下所示:

Displaying all contacts and information:
    Mike, Dim, 123456789, email
    Foo, Bar, 987654321, hello@wor.ld

【讨论】:

  • 我看到并喜欢这种方法,但我仍处于“初学者”课程中,因此您使用的许多方法我都不熟悉,因为我无法使用它不能使用我们还没有被教过的任何东西。我很想尝试一下,看看它是如何工作的。谢谢!
  • @EOxJ 我不知道你在做作业!
  • @EOxJ 我怀疑错误出在您的 ArrayList 类中。你能告诉我们那个代码吗?
  • 是的,但我希望很快就会看到你展示的内容 :)
  • 贴在帖子里
【解决方案3】:

您已经在 ArrayList 的 toString 方法中循环。所以你不应该这样做

cal1.toString();

而不是

for(Contact display : cal1.contactArray)
{
    System.out.println(display.toString());
}

【讨论】:

  • 所以,这可以正常工作,但它只显示用户输入的对象,而不是罐装对象,如果我再次循环并尝试添加另一个用户对象,它会“擦除”最后一个一个进入。
  • 你的循环对我来说看起来不错。我认为问题可能出在将联系人添加到列表的方法中。可以发一下你的方法add吗?
  • 好的!我会把它添加到帖子中
  • @EOxJ 我在提到的代码中找不到任何可能产生意外结果的错误。必须有一些其他代码处理您的列表。可能是您的其他开关盒。
  • 它不是在 switch 案例中,而是在我的 ContactArrayList 类的 toString 中,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2020-11-22
  • 2019-06-11
  • 2013-05-06
  • 1970-01-01
相关资源
最近更新 更多