Проблема сопоставления строки Java с массивом - PullRequest
0 голосов
/ 06 ноября 2008

Мне нужно посмотреть, совпадает ли строковое значение со значением объекта, но почему это не сработает?

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 ]

12 голосов
/ 06 ноября 2008

Что такое "пакеты"? Это не будет строка - так как бы она равнялась строке?

Я подозреваю, что вы имели в виду ваш тест:

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

Однако вы все равно будете распечатывать «Вы не ввели правильный аромат» для каждого пакета «неправильного» ароматизатора, даже если есть пакет с правильным ароматом!

Я подозреваю, что вы хотите переместить отчет об ошибках в конец метода после цикла и выполнять его только в том случае, если counter == 0

3 голосов
/ 06 ноября 2008

Вы, вероятно, имеете в виду что-то вроде

if (packets.get(index).equals(flavour)) {
   ...
2 голосов
/ 06 ноября 2008

Проблема с методами, объявленными в Object, заключается в отсутствии статической проверки типов при их использовании. То же самое относится к синхронизированным, где обычно блокируется неправильный объект.

В этом случае Object.equals (Object) работает с любыми двумя объектами. Вы использовали коллекцию, пакеты, вместо того, чтобы получить из нее элемент. Важный вопрос не в том, как появилась эта конкретная ошибка, а в том, как мы можем предотвратить ее появление.

Прежде всего, используйте дженерики и назначьте каждый элемент для итерации статически типизированному локальному:

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> вместо коллекции.

2 голосов
/ 06 ноября 2008

Предполагая, что пакеты являются коллекцией (и вы используете 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;
}
0 голосов
/ 06 ноября 2008

Вы должны сделать это таким образом, чтобы быть уверенным, что вы действительно сравниваете строки самым надежным способом.

Я также исправил вашу петлю

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; 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...