【问题标题】:How does this Boolean array work?这个布尔数组是如何工作的?
【发布时间】:2016-09-27 00:32:49
【问题描述】:

我不明白这段代码是如何工作的。问题是在给定年份后找到具有不同数字的下一年。

public Main(){
    try{
        BufferedReader in;
        in = new BufferedReader (new InputStreamReader (System.in)); //Used for CCC
        String year = (in.readLine());
        for(int i = Integer.parseInt(year)+1;; i++){
            String f = Integer.toString(i);
            boolean [] characters = new boolean[10];
            boolean unique = true;
            for(int x = 0; x < f.length(); x++){
                if (characters[f.charAt(x) - '0']){
                    unique = false;
                    break;
                }
                else{
                    characters[f.charAt(x)-'0'] = true; 
                }
            }   
            if (unique){
                System.out.println(f);
                return; 
            }

这个 if 语句具体是如何工作的?

if (characters[f.charAt(x) - '0']){

在这里检查布尔值有什么作用?他们不应该都默认为假吗?为什么-'0'在那里?抱歉这个菜鸟问题。

【问题讨论】:

  • 您是否尝试过设置断点或以其他方式调试代码以尝试自己理解?
  • Shouldn't they all be defaulted to false? - 是的,它们是,但你没有检查characters[x]你正在检查characters[f.charAt(x)-'0']
  • @cricket_007 我已经尝试过了,但我对 java 很陌生,所以我真的不知道如何使用调试器。我会看一些关于它的视频,谢谢你的建议。跨度>
  • 我怀疑你错过了else 部分。如果没有发现位置为真,则设置为真(characters[f.charAt(x)-'0'] = true; ),这样以后发现位置已经为真就知道是第二次遇到字符了

标签: java arrays boolean


【解决方案1】:

表达式

f.charAt(x) - '0'

将返回一个介于 0 和 9 之间的数字,具体取决于字符串 f 中位置 x 的数字。因此,代码将在数组中的 10 位数字位置中的每一个位置设置一个布尔标志,如果一个数字出现不止一次,那么它将报告错误并跳出内部循环以考虑下一年。

【讨论】:

  • 什么是布尔标志?我用谷歌搜索了它,但我真的不知道它只是将布尔值设置为 false 还是 true?
  • @I.Lav 是的,它只是在characters 数组中为遇到的每个数字设置true。如果它找到一个它已经看到的数字,那么它将拒绝那一年。
【解决方案2】:

characters 是一个由 10 个元素组成的布尔数组,用于存储给定的输入字符(应该限制为十进制数字)是否在输入中出现多次。

数字的字符代码在 0x30 - 0x39 范围内; f.charAt(x) 返回输入中索引 x 处的字符,然后 - '0' 将其转换为 0 - 9 范围内的数字 - 布尔数组的索引。

当第一次找到一个字符时,它的槽被设置为true;再次找到时,unique 设置为false,表示输入有重复字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多