将Java String与数组匹配的问题

时间:2008-11-05 21:42:27

标签: java arrays string

我需要查看字符串值是否与对象值匹配,但为什么这不起作用?

public int countPacks(String flavour) {
    int counter = 0;
    for(int index = 0; index < packets.size(); index++) {            
        if (packets.equals(flavour)) {
           counter ++;
        }
        else {
           System.out.println("You have not entered a correct flavour");
        }
    } 
    return counter; 
}

5 个答案:

答案 0 :(得分:12)

什么是“数据包”?它不会是一个字符串 - 所以它如何等于一个字符串?

我怀疑你的意思是:

if (packets.get(index).equals(flavour))

然而,即使有一种味道合适的味道,你仍然会打印出“你没有输入正确味道”的每一包“错误”味道!

我怀疑您希望在循环之后将错误报告移动到方法的末尾,并且仅在counter == 0

时执行它

答案 1 :(得分:3)

你可能意味着像

if (packets.get(index).equals(flavour)) {
   ...

答案 2 :(得分:2)

假设数据包是一个集合(并且您使用的是JDK 1.5或更高版本),您也可以使用该方法:

public int countPacks(String flavor) {
   int numOccurrences = java.util.Collections.frequency(packets, flavor);
   if(numOccurrences == 0) {
      System.out.println("You have not entered a correct flavor");
   }
   return numOccurrences;
}

答案 3 :(得分:2)

在Object中声明的方法的一个问题是它们的使用中缺少静态类型检查。这同样适用于synchronized,通常会锁定错误的对象。

在这种情况下,Object.equals(Object)可以处理任何两个对象。您已经使用了集合,数据包,而不是从中获取元素。重要的问题不是这个特定的bug是如何产生的,而是我们如何才能防止它首先发生。

首先,使用泛型并将迭代的每个元素分配给静态类型的本地:

public int countPacks(String flavour) {
    // [ The field represents a count. ]
    int count = 0;
    for(int index=0; index<packets.size(); ++index) {
        String packet = packets.get(index);
        if (packet.equals(flavour)) {
           ++count;
        }
    } 
    // [The error mesage was printed for each non-match.
    //  Even this is probably wrong,
    //    as it should be valid to have no packs of a valid flavour.
    //  Having the message in this method is actually a bit confused.]
    if (count == 0) {
        System.out.println("You have not entered a correct flavour");
    }
    return count; 
}

我们可以使用增强的for循环进一步整理它。

public int countPacks(String flavour) {
    int count = 0;
    for(String packet : packets) {
        if (packet.equals(flavour)) {
           ++count;
        }
    } 
    if (count == 0) {
        System.out.println("You have not entered a correct flavour");
    }
    return count; 
}

看起来更清楚,但是一个优秀的程序员知道他/她的图书馆。

public int countPacks(String flavour) {
    int count = Collections.frequency(packets, flavour);
    if (count == 0) {
        System.out.println("You have not entered a correct flavour");
    }
    return count; 
}

您可能还会考虑Map<String,Integer>而不是集合。

答案 4 :(得分:0)

你应该这样做,以确保你真正以最简单的方式比较字符串。

我还修复了你的循环

public int countPacks(String flavour, List packets)
    {
        int counter = 0;
        for (Iterator iter = packets.iterator(); iter.hasNext();) {
            Map packet = (Map) iter.next();

            if (packet.get("flavour").toString().equalsIgnoreCase(flavour)) {
                counter ++;
            }
          else {
            System.out.println("You have not entered a correct flavour");
            }
        } 
        return counter; 
    }