【问题标题】:Accept only unique input in java只接受java中的唯一输入
【发布时间】:2014-01-10 06:31:09
【问题描述】:

我有以下 java 代码,它接受 10 个字符串输入。我只需要接受唯一的输入。我的意思是说如果第一个设备地址是“123”并且第二个设备地址也是“123”那么它应该显示一个错误。

这是示例代码,我已将其缩短。

  InputStreamReader istream = new InputStreamReader(System.in) ;
  BufferedReader bufRead = new BufferedReader(istream) ;

  for (int i=0; i<10; i++)
  {
  try {
    System.out.println("Device Address: ");
    String DevAdd = bufRead.readLine();

    System.out.println("Device address:" + DevAdd);
     }
     catch (IOException err) {
          System.out.println("Error reading line");
     }
     catch(NumberFormatException err) {
          System.out.println("Error Converting Number");
     }     
     }

【问题讨论】:

  • 为什么不使用 HashMap?读取值,检查它是否在地图中,如果是 - 抛出异常;如果没有 - 添加到地图

标签: java validation input


【解决方案1】:

使用Set&lt;String&gt;,像这样:

// before the loop:
Set<String> set = new HashSet<String();

// inside loop:
String id = // read id;

if (!set.add(id)) {
    // error - id has been used before
}

Setadd() 方法返回 true 如果集合被操作更改,如果该值之前已经看到则返回 false,因为 Sets 不允许重复值并尝试添加已在 Set 中的值将是无操作的。

如果在将值添加到 Set 之前尚未看到该值,这就是您希望为下一次迭代做好准备的内容。

【讨论】:

    【解决方案2】:

    看看这个:

    Set<String> inputSet= new HashSet<String>();
    
    for (int i = 0; i < 10; i++) {
        try {
            System.out.println("Device Address: ");
            String DevAdd = bufRead.readLine();
    
            // Check if already exists. If yes, throw exception
            if(inputSet.contains(DevAdd)) {
                throw new Exception("Already exists");
            }
            //  Indicates input does not exist in the set. Add it       
            inputSet.add(DevAdd);
    
            System.out.println("Device address:" + DevAdd);
        } catch (IOException err) {
            System.out.println("Error reading line");
        } catch (NumberFormatException err) {
            System.out.println("Error Converting Number");
        }
    }
    

    【讨论】:

      【解决方案3】:

      将这些值保存在地图中作为Map&lt;device,address&gt;,这样当您尝试验证地址是否唯一时,只需访问这些地图,您就可以轻松知道地址是否唯一

      【讨论】:

        【解决方案4】:

        将其存储在集合中检查值是否存在并抛出错误..
        使用Set 也可以做到这一点,但是即使您不检查(请求抛出异常)该值是否存在,它也只会允许添加唯一值.. 可以完成以下两件事

        1) 使用 Bohemian 提到的 if (!set.add(input)) 之类的东西
        2) 使用set.contains

        【讨论】:

        • 显示一个例子。另外,set 会更好(map.containsKey() 而不是 containsValue())?
        • 是的,但是如果你给它一个重复的值,Set 不会抛出异常。但它确实返回一个可以检查的布尔值
        • 您可以通过set.contains 来检查该值是否存在
        • 是的,更新了我的答案,Set 肯定是一个更好的选择
        【解决方案5】:

        虽然 set 是这个场景最适合的数据结构 因为它不允许重复,(请参阅 ankur 的 set 答案)您 也可以使用列表 如下所示。

        public class HelloWorld{
        
             public static void main(String []args){
                InputStreamReader istream = new InputStreamReader(System.in) ;
          BufferedReader bufRead = new BufferedReader(istream) ;
          List<String> list=new ArrayList<String>();
          for (int i=0; i<10; i++)
          {
          try {
            System.out.println("Device Address: ");
            String DevAdd = bufRead.readLine();
            if(!list.contains(DevAdd))
            list.add(DevAdd);
            else
            throw new Exception("Already exists");
            System.out.println("Device address:" + DevAdd);
             }
             catch (IOException err) {
                  System.out.println("Error reading line");
             }
             catch(NumberFormatException err) {
                  System.out.println("Error Converting Number");
             }     
             }
             }
        }
        

        【讨论】:

          【解决方案6】:

          最好将其存储在 Set 中。每次在将条目添加到集合之前,请检查它是否属于集合。如果没有添加则抛出错误。

          【讨论】:

          • 您可以在 ankurs 答案中看到示例。
          • 那你的有什么用?
          • 他在我之后发布了答案。
          猜你喜欢
          • 2019-07-24
          • 1970-01-01
          • 2017-11-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-05
          • 2013-01-06
          • 1970-01-01
          • 2016-01-01
          相关资源
          最近更新 更多