Java 中的 if/else 循环中的变量问题


import java.util.HashMap;
public class Driver {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    String location = "memes more memes Virginia";
    String test = createStateMap(location);
    System.out.println(test);

}

public static String createStateMap(String loc) {
    loc = loc.toUpperCase();
    String secondLast; // Retrieves potential second to last value 
    String lastWord; // Retrieves last value 
    String state = "failed";
    String trimmed = loc.trim(); // Take off spaces at the end of String
    String o = trimmed.substring(0, trimmed.lastIndexOf(" ")); // Remove last Word in String   EX. "SOUTH CAROLINA" = "SOUTH"
    String otrim = o.trim(); // Take off spaces at the end of String
    if (trimmed.contains("/")){
    secondLast = otrim.substring(otrim.lastIndexOf("/")+1); 
    lastWord = trimmed.substring(trimmed.lastIndexOf("/")+1);
    } else { 
        secondLast = otrim.substring(otrim.lastIndexOf(" ")+1); 
        lastWord = trimmed.substring(trimmed.lastIndexOf(" ")+1);
    }


    HashMap<String,String> names = new HashMap<String,String>();
       names.put("ALABAMA", "AL");
       names.put("ALASKA", "AK");
       names.put("ARIZONA", "AZ");
       names.put("ARKANSAS", "AR");
       names.put("CALIFORNIA", "CA");
       names.put("COLORADO", "CO");
       names.put("CONNECTICUT", "CT");
       names.put("DELAWARE", "DE");
       names.put("FLORIDA", "FL");
       names.put("GEORGIA", "GA");
       names.put("HAWAII", "HI");
       names.put("IDAHO", "ID");
       names.put("ILLINOIS", "IL");
       names.put("INDIANA", "IN");
       names.put("IOWA", "IA");
       names.put("KANSAS", "KS");
       names.put("KENTUCKY", "KY");
       names.put("LOUISIANA", "LA");
       names.put("MAINE", "ME");
       names.put("MARYLAND", "MD");
       names.put("MASSACHUSETTS", "MA");
       names.put("MICHIGAN", "MI");
       names.put("MINNESOTA", "MN");
       names.put("MISSISSIPPI", "MS");
       names.put("MISSOURI", "MO");
       names.put("MONTANA", "MT");
       names.put("NEBRASKA", "NE");
       names.put("NEVADA", "NV");
       names.put("NEWHAMPSHIRE", "NH");
       names.put("JERSEY", "NJ");
       names.put("MEXICO", "NM");
       names.put("YORK", "NY");
       names.put("CAROLINA", "NC");
       names.put("DAKOTA", "ND");
       names.put("OHIO", "OH");
       names.put("OKLAHOMA", "OK");
       names.put("OREGON", "OR");
       names.put("PENNSYLVANIA", "PA");
       names.put("RHODEISLAND   ", "RI");
       names.put("CAROLINA", "SC");
       names.put("DAKOTA", "SD");
       names.put("TENNESSEE", "TN");
       names.put("TEXAS", "TX");
       names.put("UTAH", "UT");
       names.put("VERMONT", "VT");
       names.put("VIRGINIA", "VA");
       names.put("WASHINGTON", "WA");
       names.put("VIRGINIA", "WV");
       names.put("WISCONSIN", "WI");
       names.put("WYOMING", "WY");
       System.out.println(secondLast);
    if (names.containsValue(lastWord)){
        state = lastWord;
    } 
    if (names.containsKey(lastWord)){
        if (names.get(lastWord).equals("CAROLINA")){ // Differentiate NC and SC
            if (secondLast.equals("North")){
                state = "NC";
            } else { state = "SC"; }
        } if (names.get(lastWord).equals("DAKOTA")) { // Differentiate ND and SD
            if (secondLast.equals("North")){
                state = "ND";
            } else { state = "SD"; }
        } if (names.get(lastWord).equals("VIRGINIA")) { // Differentiate WV and VA
        if (secondLast.equals("West")){
                state = "WV";
            } else { state = "VA"; }
        } else { state = names.get(lastWord); } 
        }
    return state;}  }

我目前在使用我的代码时遇到问题,该代码根据传递给 createStateMap 方法参数的字符串将状态的缩写分配给变量。当lastWord字符串为弗吉尼亚州、达科他州或卡罗来纳州时,即使secondLast不是北或西,它们将始终被分配为 WV、ND 或 NC。

任何帮助将不胜感激,我已经在这个上停留了一段时间。

names.get(lastWord)已经为键"CAROLINA"返回"SC",所以你的

names.get(lastWord).equals("CAROLINA")

条件将始终返回 false。

Map 中放置相同的键两次也是没有意义的,因为第二个值将覆盖具有相同键的第一个值。

为什么不把州的全名作为键?

   names.put("SOUTH CAROLINA", "SC");
   names.put("NORTH CAROLINA", "NC");

在这种情况下

state = names.get(fullStateName);

将始终有效,您可以消除所有这些条件,只要fullStateName包含状态的全名(单个单词或两个单词(。

如果不知道是应该搜索Map中的最后一个单词还是最后两个单词,可以搜索最后两个单词,如果没有找到,搜索最后一个单词:

state = names.get(secondLast + " " + lastWord);
if (state == null) {
    state = names.get(lastWord);
}

所以,仅供参考,

names.put("VIRGINIA", "VA");
names.put("WASHINGTON", "WA");
names.put("VIRGINIA", "WV");

您在这里使用的是 HashMap,因此每个键只能有 1 个值。这意味着提取VIRGINIA时获得的唯一值是WV(最后一个要输入的值(。只需输入完整的州名,正如Eran建议的那样。我的意思是,你已经在输入NEWHAMPSHIRE,这在技术上是两个词,所以我不明白你为什么不想为卡罗来纳州,达科他州和弗吉尼亚州做同样的事情。

最新更新