【问题标题】:Remove User Duplicate From Array String从数组字符串中删除用户重复项
【发布时间】:2016-01-06 20:59:41
【问题描述】:

我正在尝试创建一个程序,该程序可以接受用户想要输入的尽可能多的社会安全号码。唯一的限制是数字必须遵循格式 XXX-XX-XXXX 并且不接受重复的条目。这是我目前所拥有的:

子类 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;
    }   
}

主类

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!");
            }
        }
    }
}

我在子类 1 下的 public boolean validateSSNNumber 方法做错了什么,或者我的代码中有更多我不知道的错误?

【问题讨论】:

  • 似乎arrayCount 在成功验证后增加了两次。首先是SSNArrayExpanded.validateSSNNumber(),然后是SSNArray.addSSN()。这是正确的吗?另外,代码ssnNumber[y].equals(ssnNumber[arrayCount]) 不会产生ArrayIndexOutOfBoundsException 吗?我是说只看代码。所以如果我错了,请纠正我。

标签: java arrays string boolean duplicates


【解决方案1】:

在你的 subclass1 中你可以试试这个。您需要将用户输入的 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;
    }

【讨论】:

    【解决方案2】:

    您可以尝试使用 Set,它可以轻松帮助您检查任何重复项并减少您对数组的迭代。

    【讨论】:

      【解决方案3】:

      为什么不能使用 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    
      } 
      

      【讨论】:

      【解决方案4】:

      这是您的完整解决方案,您可以根据需要添加 N 个 SSN 号码,

      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
      

      【讨论】:

      • @iNoto 这个代码很容易理解,也很容易维护。
      【解决方案5】:
          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;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多