使用toString和Enhanced for循环

时间:2018-04-22 21:46:17

标签: java for-loop arraylist

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

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

在我的main / driver类中,我有一个ContactArrayList类的对象,并创建了一个" user"对象和几个"罐头" Contact类的对象。

我的问题:

当用户选择显示所有联系人的信息时,包括预设对象和用户对象,我尝试使用toString类的增强型for循环W / ContactArrayList方法,但因为我我使用Contact类"迭代器"使用增强的for循环当我想使用ContacttoString时,变量将通过ContactArrayList 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类的更多信息,请告诉我们!

3 个答案:

答案 0 :(得分:2)

感谢您提供缺少的课程。 问题出在您的Contact班级:

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

这些变量都是static,这意味着它们每Contact不存在一次,但每个应用程序一次。因此,所有Contact将共享相同的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<Contact> contactArray。它不是一个数组。称之为members ..

    3. Contacts - &gt;您的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) > -1替换为.contains(passedString)。它可能会做同样的事情,但更容易阅读。
    6. 我不太确定public static String userInput()中的方法Contact应该做什么。看起来你可以摆脱它。
    7. Contact extends Comparable的继承是错误的。它应该是Contact extends Comparable<Contact>

    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. sort方法替换为Collections.sort(members);(您可以这样做,因为Contact现在是Comparable<Contact> {/ 1}}

答案 1 :(得分:1)

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; 

首先,我们从Stream创建contacts。然后,我们将Stream Contact转换为Stream Stringmap。我们再次创建四个值中的Stream并将其与,连接起来。第二个Stream将创建每个联系人。

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

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

答案 2 :(得分:0)

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

cal1.toString();

而不是

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