Java错误:char无法解除引用

时间:2014-12-27 23:41:31

标签: java

以下是老师要我做的事情:

输入电话号码(为电话号码设置字符串类型对象) 例: (703)323-3000

使用以下格式显示电话号码:

示例1:

您输入的电话号码是703-323-3000。

显示包含字符串中每个数字计数的数组内容。使用类似于以下的格式:

实施例: 数字0出现了4次。

数字1出现了0次。

数字2出现了1次。

数字3出现了4次。

数字4出现了0次。

数字5出现了0次。

数字6出现了0次。

数字7出现了1次。

数字8出现了0次。

数字9显示0次

老师还为我们提供了一个算法作为提示:

设置一个大小为10的整数数组 将每个元素初始化为零 输入电话号码的字符串 set SIZE =字符串的长度 设置循环以迭代SIZE次 {   得到下一个角色   适当更新数组   (例如:如果字符为'7',则将数组[7]递增1。  }

使用适当的消息显示BOTH:     原始电话号码     数组的内容(使用循环)。

这是我的代码但它显示了我在使用equals()方法时提到的错误,如果我使用==则显示错误的答案。请帮忙。

public class Phones
{
    public static void main(String[] args)
    {

    int Num[] = {0,0,0,0,0,0,0,0,0,0};
    String Phone = "703-323-3000";

    int SIZE = Phone.length() - 1;

    for(int count=0; count<= SIZE; count++)
    {
        for(int counter = 0; counter <= SIZE; counter++)
        {
            if(Phone.charAt(counter).equals(count))
            Num[count]++;
        }

        System.out.println("Digit " + count + " showed up " + Num[count] + " times");
    }





    }
}

这是我第一次访问本网站,如果这太长或太难以理解,请提前抱歉。谢谢。

4 个答案:

答案 0 :(得分:2)

您使用==得到错误答案的原因是您正在将char与int进行错误比较。简而言之,您将counter与字符的unicode值进行比较,而不是与字符表示的数字进行比较。 (对于字母,数字和简单标点符号等“普通”字符,unicode值与ASCII values相同。)

char '0' not 的int值为0 - 它具有char 0的unicode值,即0x0030(又名为48)在基数10中 - 0x格式以十六进制显示。通过比较char你正在做的方式,第一次比较只有在char是所谓的“null char”0x0000时才会成立(不要与null混淆,这是一个null 参考!),任何类型的“正常”输入都不会发生。

相反,您需要一种方法来将字符与字符进行比较。最简单的方法是从当前char中减去'0' char的值:

int charDistanceFromZero = Phone.charAt(counter) - '0';

如果该距离小于0或大于9,则您的字符不是数字。否则,charDistanceFromZero是数组中需要的偏移量。

这是有效的,因为数字的字符从0开始并从那里开始连续。尝试为其中的一些计算charDistanceFromZero,以了解它是如何获得数组索引的。

答案 1 :(得分:1)

charAt将返回char类型的值,这就是您无法执行.equals(...)的原因。

此外,表示数字的字符位于['0' .. '9']中,且与区间[0 .. 9]不同。您需要通过减去'0'来翻译范围。

答案 2 :(得分:0)

您的错误原因是charAt返回char,这是一种基本类型。您需要拥有一个对象,而不是一个原语,以便能够调用方法,例如.equals。此外,当您尝试使用==代替.equals时,您将charint值进行比较。这样做是可以的,只要你记住一个字符的int值是其编码值,'0'为48,'1'为49,所以上。

要解决这个问题,最好使用Java Character课程中免费提供的方法;值得注意的是isDigit,它确定一个字符是否为数字,getNumericValue,它将一个字符转换为它所代表的数字。

也可以完全省去外部循环,因为一旦您将每个数字字符转换为其数字值,您已经拥有了要增加的数组中的索引。所以这里有一个更清晰的解决方案,根本不使用嵌套循环。

public class Phones{
    public static void main(String[] args){

        int counters[] = new int[10];
        String phone = "703-323-3000";

        for (char eachCharacter : phone.toCharArray()) {
            if (Character.isDigit(eachCharacter)) {
                int digit = Character.getNumericValue(eachCharacter);
                counters[digit]++;
            }
        }

        for(int digit = 0; digit < 10; digit++) {
            if (counters[digit] != 0) {
                System.out.format("Digit %d showed up %d times.%n", digit, counters[digit]);
            }
        }
    }
}

这里,第一个循环遍历输入字符串,递增对应于字符串中每个数字的数组索引。第二个循环只打印出它找到的计数。

答案 3 :(得分:0)

其他答案很好......但是为了减少代码中的歧义我通常只是在执行任何控制流之前将字符串发送到char数组中......如上所述,&#39; Zero&#39;在Unicode Code Point 48,因此您需要从字符索引中减去该值。

    char[] number =  "212-555-1212".toCharArray();

    for(int i = 0; i < numbers.length; i++) {
        // do something groovy with numbers[i] - 48    
    }

所以对于这个解决方案,你可能会做这样的事情......

    String phone = "212-555-1212".replaceAll( "[^\\d]", "" );
    int[] nums = new int[phone.length()];
    int[] queue = new int[phone.length()];

    for(int i = 0; i < nums.length; i++) {
        nums[i] = phone.toCharArray()[i] - 48;
        for(int num : nums) {
            if( nums[i] == num ) {
                queue[i] += 1;
            }
        }
        System.out.println( "Number: " + nums[i] + " Appeared: " + queue[i] + " times." );
    }