Как сравнить символ с номером в Java - PullRequest
0 голосов
/ 05 февраля 2019

У меня проблема, и я думаю, что это в сравнении символа с числом.

String FindCountry = "BB";

Map<String, String> Cont = new HashMap <> ();

Cont.put("BA-BE", "Angola");
Cont.put("9X-92", "Trinidad & Tobago");



for ( String key : Cont.keySet()) {

  if (key.charAt(0) == FindCountry.charAt(0) && FindCountry.charAt(1) >= key.charAt(1) && FindCountry.charAt(1) <= key.charAt(4)) {

    System.out.println("Country: "+ Cont.get(key));

  }
}

В этом случае код печатает «Ангола», но если

String FindCountry = "9Z" 

, он ничего не печатает.Я не уверен, что думаю, что проблема в том, что он не может сравнить, что «2» больше, чем «Z».В этом примере я получил только два Cont.put (), но в моем файле я получил намного больше, и многие из них не только с символами.У меня проблема с ними.

Какой самый умный и лучший способ сравнить символ с числом?На самом деле, если я установлю правило, например, «1» больше, чем «Z», все будет в порядке, потому что мне нужен такой способ увеличения: AZ-9-0.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Как и другие отмечали в комментариях, такие математические операции сравнения на символах основаны на фактических значениях ASCII каждого символа.Поэтому я бы посоветовал вам реорганизовать свою логику, используя ASCII-таблицу в качестве эталона.

0 голосов
/ 05 февраля 2019

Если вы используете только символы A-Z и 0-9, вы можете добавить метод преобразования между ними, который увеличит значения символов 0-9, чтобы они были после A-Z:

int applyCharOrder(char c){
  // If the character is a digit:
  if(c < 58){
    // Add 43 to put it after the 'Z' in terms of decimal unicode value:
    return c + 43;
  }
  // If it's an uppercase letter instead: simply return it as is
  return c;
}

Что можно использовать следующим образом:

if(applyCharOrder(key.charAt(0)) == applyCharOrder(findCountry.charAt(0))
    && applyCharOrder(findCountry.charAt(1)) >= applyCharOrder(key.charAt(1))
    && applyCharOrder(findCountry.charAt(1)) <= applyCharOrder(key.charAt(4))){
  System.out.println("Country: "+ cont.get(key));
}

Попробуйте онлайн.

Примечание: Воттаблица с десятичными значениями Юникода. Символы '0'-'9' будут иметь значения 48-57, а 'A'-'Z' будут иметь значения 65-90.Таким образом, < 58 используется для проверки того, является ли это цифрой, а + 43 увеличит 48-57 до 91-100, поместив их значения выше 'A'-'Z', чтобы ваши <= и >= проверялибудет работать так, как вы хотите.


В качестве альтернативы, вы можете создать строку поиска и использовать ее индекс для заказа:

int applyCharOrder(char c){
  return "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".indexOf(c);
}

Попробуйте онлайн.

PS: Как уже упоминалось в первом комментарии @ Stultuske , переменные обычно находятся в camelCase, поэтому онине начинаются с заглавной буквы.

0 голосов
/ 05 февраля 2019

Вы можете использовать справочный «стол», я использовал String:

private static final String LOOKUP = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

, а затем сравнить символы с indexOf(), но это кажется грязным и, вероятно, может быть легче достичь,Я просто не могу придумать что-то более легкое в данный момент:

String FindCountry = "9Z";

Map<String, String> Cont = new HashMap<>();

Cont.put("BA-BE", "Angola");
Cont.put("9X-92", "Trinidad & Tobago");

for (String key : Cont.keySet()) {
    if (LOOKUP.indexOf(key.charAt(0)) == LOOKUP.indexOf(FindCountry.charAt(0)) &&
        LOOKUP.indexOf(FindCountry.charAt(1)) >= LOOKUP.indexOf(key.charAt(1)) &&
        LOOKUP.indexOf(FindCountry.charAt(1)) <= LOOKUP.indexOf(key.charAt(4))) {
        System.out.println("Country: " + Cont.get(key));
    }
}
...