2015-10-09 3 views
0

Я пытаюсь создать программу, которая принимает столько номеров социального обеспечения, сколько пользователь хочет ввести. Единственное ограничение состоит в том, что номера должны соответствовать формату XXX-XX-XXXX и не принимать дублированные записи. Это то, что я до сих пор:Удалить User Duplicate From Array String

Подкласс 2

package SSNServerStorageExpanded; 

class SSNArray{ 
    final String[] ssnNumber; 
    int arrayCount; 

    public SSNArray(){//defult contructor 
     ssnNumber = new String[9999]; 
     arrayCount = 0; 
    } 

    public SSNArray(int arraySize){ 
     ssnNumber = new String[arraySize]; 
     arrayCount = 0; 
    } 

    public String[] getSSNNumber(){ 
     return ssnNumber; 
    } 

    public int getArrayCount(){ 
     return arrayCount; 
    } 

    public boolean validateSSNNumber(String SSNFormat){ 
     return SSNFormat.matches("\\d{3}-\\d{2}-\\d{4}"); 
    } 

    public String addSSN(String SSNFormat){ 
     if(validateSSNNumber(SSNFormat)){ 
      return ssnNumber[arrayCount++] = SSNFormat; 
     }else{ 
      return null; 
     } 
    } 

    @Override 
    public String toString(){ 
     String str = "\nThe Social Security Number(s) you entered is(are):\n"; 
     for(int x = 0; x < arrayCount; x++){/ 
      str += ssnNumber[x] + "\n"; 
     }return str; 
    } 
} 

Подкласс 1

package SSNServerStorageExpanded; 

public class SSNArrayExpanded extends SSNArray{ 

    public SSNArrayExpanded(){ 
     super(); 
    } 

    public SSNArrayExpanded(int arraySize){ 
     super(arraySize); 
    } 

    @Override 
    public boolean validateSSNNumber(String SSNFormat){ 
     if(super.validateSSNNumber(SSNFormat)){ 
      boolean duplicate = false; 
      for(int y = 0; y < arrayCount; y++){ 
       if(ssnNumber[y].equals(ssnNumber[arrayCount])){ 
        System.out.println("No duplicates allowed, please try again"); 
        duplicate = true; 
        break; 
       } 
      } 
      if(!duplicate){ 
       arrayCount++; 
      } 
     } 
     return true; 
    } 
} 

MainClass

package SSNServerStorageExpanded; 
import java.util.Scanner; 

public class SSNArrayTestExpanded{ 
    public static void main(String[] args){ 
     SSNArrayExpanded SSNArrayExpandedObject = new SSNArrayExpanded(); 
     Scanner input = new Scanner(System.in); 

     System.out.println("Initiating SSN Server Storage Expanded"); 
     System.out.println("► Type 'EXIT' at any moment to close the program ◄\n"); 

     boolean run = true; 
     while(run){ 
      System.out.print("Enter your Social Security Number(XXX-XX-XXXX): "); 
      String ssnNumber = input.next(); 

      if(ssnNumber.equalsIgnoreCase("EXIT")){ 
       System.out.print(SSNArrayExpandedObject.validateSSNNumber(ssnNumber)); 
       return; 
      }else if(SSNArrayExpandedObject.validateSSNNumber(ssnNumber)){ 
       SSNArrayExpandedObject.addSSN(ssnNumber); 
      }else{ 
       System.out.println("!Please use the format XXX-XX-XXXX!"); 
      } 
     } 
    } 
} 

Что я делаю неправильно с моим public boolean validateSSNNumber метод под подкласс 1 или есть ли больше ошибок в моем коде, о которых я не знаю?

+0

Похоже, что 'arrayCount' увеличивается в два раза после успешной проверки. Сначала в 'SSNArrayExpanded.validateSSNNumber()', затем в 'SSNArray.addSSN()'. Правильно ли это? Кроме того, не генерирует ли код 'ssnNumber [y] .equals (ssnNumber [arrayCount])' ArrayIndexOutOfBoundsException'? Я говорю, просто посмотрев на код. Поэтому, пожалуйста, поправьте меня, если я ошибаюсь. –

ответ

0

В вашем подклассе1 вы можете попробовать это. Вам нужно сравнить строку SSNFormat, введенную пользователем с помощью значений массива (вы сами сравнивали значения массива). Не увеличивайте счет массива здесь, а выполняйте его в функции addSSN, как вы делали.

@Override 
public boolean validateSSNNumber(String SSNFormat){ 
    if(super.validateSSNNumber(SSNFormat)){ 
     boolean duplicate = false; 
     for(int y = 0; y < arrayCount; y++){ 
      if(ssnNumber[y].equals(SSNFormat)){ 
       System.out.println("No duplicates allowed, please try again"); 
       duplicate = true; 
       break; 
      } 
     } 
     if(!duplicate){ 
      return true; 
     } 
    } 
    return false; 
} 

При использовании класса SSNArray этой функции для добавления номера SSN без повторного подтверждения SSNFormat.

public String addSSN(String SSNFormat){ 
     return ssnNumber[arrayCount++] = SSNFormat; 
    } 
0

Вы можете попробовать использовать Set, который легко поможет вам проверить наличие дубликатов и уменьшит вашу итерацию над массивом.

0

Вот ваше полное решение, с этим вы можете добавить N-число ПКР-номер, как вы хотите,

import java.util.HashSet; 
import java.util.Scanner; 


class SSNSet{ 
    final HashSet<String> allSsnNumber = new HashSet<String>(); 

    public HashSet<String> getAllSsnNumber() { 
     return allSsnNumber; 
    } 

    public boolean validateSSNNumber(String SSNFormat){ 
     return SSNFormat.matches("\\d{3}-\\d{2}-\\d{4}"); 
    } 

    public boolean addSSN(String SSNFormat){ 
     if(validateSSNNumber(SSNFormat)){ 
      boolean flag; 
      if(allSsnNumber.add(SSNFormat)){ 
       System.out.println("Added Successfully"); 
       flag = true; 
      }else{ 
       System.out.println("Duplicate Not Allow"); 
       flag = false; 
      } 
      return flag; 
     }else{ 
      System.out.println("!Please use the format XXX-XX-XXXX!"); 
      return false; 
     } 
    } 

} 

public class SSNArrayTestExpanded{ 
    public static void main(String[] args){ 
     SSNSet SSNArrayExpandedObject = new SSNSet(); 
     Scanner input = new Scanner(System.in); 

     System.out.println("Initiating SSN Server Storage Expanded"); 
     System.out.println(" Type 'EXIT' at any moment to close the program \n"); 

     boolean run = true; 
     while(run){ 
      System.out.print("Enter your Social Security Number(XXX-XX-XXXX): "); 
      String ssnNumber = input.next(); 

      if(ssnNumber.equalsIgnoreCase("EXIT")){ 
       break; 
       /*System.out.print(SSNArrayExpandedObject.validateSSNNumber(ssnNumber)); 
       return;*/ 
      }else{ 
       SSNArrayExpandedObject.addSSN(ssnNumber); 
      } 
     } 

     System.out.println("==============================================="); 
     System.out.println("You have entered SSN Numbers are : "); 
     System.out.println(SSNArrayExpandedObject.getAllSsnNumber()); 
     System.out.println("==============================================="); 
     System.out.println("Program Ended Successfully"); 
    } 
} 

и Выход:

Initiating SSN Server Storage Expanded 
Type 'EXIT' at any moment to close the program 

Enter your Social Security Number(XXX-XX-XXXX): 111-11-1111 
Added Successfully 
Enter your Social Security Number(XXX-XX-XXXX): 222-22-222 
!Please use the format XXX-XX-XXXX! 
Enter your Social Security Number(XXX-XX-XXXX): 111-11-1111 
Duplicate Not Allow 
Enter your Social Security Number(XXX-XX-XXXX): 333-33-333 
!Please use the format XXX-XX-XXXX! 
Enter your Social Security Number(XXX-XX-XXXX): 333-33-3333 
Added Successfully 
Enter your Social Security Number(XXX-XX-XXXX): EXIT 
=============================================== 
You have entered SSN Numbers are : 
[111-11-1111, 333-33-3333] 
=============================================== 
Program Ended Successfully 
+0

@iNoto Этот код очень легко понять, а также maintan. –

0

Почему наклоняю вы идете LinkedHashSet структура данных для хранения номера ssn.?, обеспечивает легкое извлечение и дублирование проверки в порядке O (1).

final LinkedHashSet<String> ssnNumber; 

также код

@Override 
public boolean validateSSNNumber(String SSNFormat){ 
if(super.validateSSNNumber(SSNFormat)){ 
    boolean duplicate = ssnNumber.add(SSNFormat); 
    if(duplicate){ 
     System.out.println("No duplicates allowed, please try again"); 
     return false; 
    } 
    return true; 
    } 
    return false  
} 
+0

Hashset 'add()' Возвращает true, если этот набор еще не содержит указанный элемент Refer Docs http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html –

0
public boolean validateSSNNumber(String SSNFormat) { 
      if (super.validateSSNNumber(SSNFormat)) { 
       /* 
       *Hashset add() - Returns true if this set did not already contain 
       *the specified element. 
       *If this set already contains the element, the call leaves the set 
       * unchanged and returns 
       */ 
       boolean duplicate = !uniqueSSNNum.add(SSNFormat); 
       return duplicate; 
      } 
      return false; 
     } 

    //To use HastSet it's better if you override equals and hashcode 
    //using the fields that you'll use for comparison equality 
    // generated using eclipse 
    @Override 
     public int hashCode() { 
      final int prime = 31; 
      int result = 1; 
      result = prime * result + arrayCount; 
      result = prime * result + Arrays.hashCode(ssnNumber); 
      return result; 
     } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     SSNArray other = (SSNArray) obj; 
     if (arrayCount != other.arrayCount) 
      return false; 
     if (!Arrays.equals(ssnNumber, other.ssnNumber)) 
      return false; 
     return true; 
    }