2015-01-16 52 views
0

我不确定自己是否正确表达了自己的标题,但我会尽力在此处更具体。查找分配给ArrayList中的字符串的相同对象

我有什么:的ArrayList客户/顾客。 安排数组列表电话号码分配给客户/客户。

我的客户端类: import java.util。*;

public class Clients implements Comparable<Clients> { 

    private String name; 
    private String address; 

    public ArrayList<Share> shareList = new ArrayList<Share>(); 

    private PhoneBook phoneBook = new PhoneBook(); 

    public Clients(String name, String address) { 

     this.name = name; 
     this.address = address; 
    } 


    public void addPhoneDescription(String description) { 
     phoneBook.addPhoneDescription(description); 
    } 

    public void addPhoneNumber(String number) { 
     phoneBook.addPhoneNumber(number); 
    } 


    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

    public PhoneBook getPhoneBook() { 
     return phoneBook; 
    } 

    public boolean equals(Object obj) { 
     Clients c = (Clients) obj; 
     return this.name.equals(c.name); 
    } 

    public String toString() { 
     String result; 

     result = ("\n" + "Name: " + this.getName() + "\n" + "Address: " 
       + this.getAddress() + "\n" + "Phone description: " + this 
       .getPhoneBook()); 

     return result; 
    } 

    public int compareTo(Clients other) { 
     return name.compareTo(other.name); 

    } 

} 

这是我电话簿类由一套/ get方法:

import java.util.ArrayList; 

public class PhoneBook { 

    private ArrayList<String> numbersList = new ArrayList<String>(); 
    private ArrayList<String> phoneDescription = new ArrayList<String>(); 

    public void addPhoneDescription(String description) { 
     phoneDescription.add(description); 
    } 

    public void addPhoneNumber(String number) { // Add the phone number to the numbersList 

     numbersList.add(number); 

    } 

    public String toString(){ 
     return numbersList.toString() + phoneDescription.toString(); 
    } 


} 

我想实现:如果我创造让说,3个客户端,其中2具有相同的号码我想打印出他们分享/拥有共同号码的2位客户,等等。我有我的计划类中创建一个方法了:

public void findDuplicatedNumbers() { 

     // method that looks for duplicated numbers that clients have 

     ArrayList<Integer> sNumber = new ArrayList<>(); 
     ArrayList<Integer> duplicateNumber = new ArrayList<>(); 

     for (int i = 0; i < clientList.size(); i++) { 
      for (int k = 0; k < (clientList.get(i).getPhoneBook().size); k++) { 
       if (sNumber.contains(clientList.get(i).getPhoneBook().get(k).getNumber())) { 
        if (duplicateNumber.contains(clientList.get(i).getPhoneBook().get(k).getNumber())) { 

       } else { 
         // adds to duplicateNumber arrayList 
         duplicateNumber.add(clientList.get(i).getPhoneBook().get(k).getNumber()); 
        } 
       } else { 
        // adds to sNumber arrayList 
        sNumber.add(clientList.get(i).getPhoneBook().get(k).getNumber()); 
       } 
      } 

     } 
     for (int i = 0; i < duplicateNumber.size(); i++) { 
      System.out.println("Phone number: " + duplicateNumber.get(i) + " is share with these clients: "); 
      for (int k = 0; k < clientList.size(); k++) { 
       for (int p = 0; p < (clientList.get(p).getPhoneBook().size()); p++) { 
        if (duplicateNumber.get(i) == clientList.get(k).getPhoneBook().get(p).getNumber()) { 
         System.out.println(clientList.get(k).getName() + ", "); 
        } 
       } 
      } 
      System.out.println("\n"); 
     } 


    } 

回答

0

PUH ..安静了一个简单的任务很多代码。 KISS(保持简单):

public void findDuplicatedNumbers() { 
    Map<String, Set<Client> > duplicates = 
     new HashMap<String, Set<Client> >(); 
    Set<String> phoneNumbers = new HashSet<String>(); 

    for(Client client : clientList) { 
     PhoneBook phoneBook = client.getPhoneBook(); 
     phoneNumbers.addAll(phoneBook.getNumberList()); 
    } 

    for(String phoneNumber : phoneNumbers) { 
     Set<Client> clients = findClientsByPhoneNumber(phoneNumber); 

     if(clients.size() > 1) 
      duplicates.put(phoneNumber, clients); 
    } 

    for(Entry<String, Set<Client> entry : duplicates.entrySet()) { 

      System.out.println("phonenumber " + entry.getKey() + " is dubplicated/is share with these clients:"); 
      for(Client client : entry.getValue()) { 
      System.out.println(client.getName()); 
      } 

    } 
} 
protected Set<Client> findClientsByPhoneNumber(String phoneNumber) { 
    Set<Client> clients = new HashSet<Client>(); 

    for(Client client : clientList) { 
     List<String> phoneNumbers = client.getPhonebook().getNumberList(); 
     if(phoneNumbers.contains(phoneNumber)) { 
      clients.add(client); 
     } 
    } 
    return clients; 
} 

这不仅是清洁的结构,并实现了由寻找客户数量也更多的表现在大多数情况下,额外的接口。 只需清理你想要做的事情:如果你想存储一个唯一对象列表,它就是Set实现之一。如果你想通过键存储某些东西,可以使用Map实现。

+0

我有点理解你的代码,但我真的不需要通过编号查找客户端。在我的程序(主类)中,我有一个switch case场景,所以当用户按下一个数字时,findDuplicatedNumbers方法就会运行。仍然遇到一些困难。介意告诉我该怎么做? @Peter – Kanox

+0

但是,这正是你所做的:检查电话号码,如果他们被分配多次。你的println显示你的输出。我将修改上面的代码以使其更清楚。 – Peter

+0

说得更清楚一点:您将客户的电话号码与所有其他客户的电话号码进行比较。如果它存在于其他客户列表中,并且找到的客户端不相同,则它是重复的。因此,您确实在搜索所有客户端的特定电话号码,但只对那些分配给多个客户端的电话号码感兴趣。 – Peter

0
public class PhoneBook { 

    private ArrayList<String> numbersList = new ArrayList<String>(); 
    private ArrayList<String> phoneDescription = new ArrayList<String>(); 

    public void addPhoneDescription(String description) { 
     phoneDescription.add(description); 
    } 

    public void addPhoneNumber(String number) { // Add the phone number to the numbersList 

     numbersList.add(number); 

    } 

    public String toString(){ 
     return numbersList.toString() + phoneDescription.toString(); 
    } 

    public ArrayList<String> findDuplicatedNumbers() { 
     ArrayList<String> dupes = new ArrayList<String>(); 
     Collections.sort(numbersList); 
     Iterator<String> iter = numbersList.iterator(); 
     while(iter.hasNext()) { 
      String next = iter.next(); 
      if(iter.hasNext() && next == iter.next()) { 
       dupes.add(next); 
      } 
     } 

     return dupes; 
    } 
} 
+0

我很明白你在做什么,但我得到一个错误:线程“主”java.lang.NullPointerException中的异常 \t at Program.findDuplicatedNumbers(Program.java:253) – Kanox

+0

:/它编译但不想运行。 – Kanox

+0

此外,您还可以在PhoneBook类上找到FindDuplicatedNumbers,并且我希望它可以在Program类中使用。 :/ – Kanox

相关问题