繁体   English   中英

无法将HashMap键值与扫描仪输入进行比较

[英]Can't compare HashMap key value to Scanner input

我正在尝试将HashMap的键值与用户输入生成的数组的索引进行比较。 总体目标是将2000年12月25日变成2000年12月25日,除此之外,其他所有方法都可以正常工作。

import java.util.*;

class Dates {

private static final Set<Integer> THIRTY_DAY_MONTHS = new HashSet<>(Arrays.asList(4, 6, 8, 11));
private static Map<Integer, String> MONTHS = new HashMap<>(12);
private static String monthString;

public static void main(String[] args) {
    try {
        System.out.println("Enter month/day/year to be converted to normal format: ");
        Scanner s = new Scanner(System.in);

        String[] input = s.nextLine().split("/");

        int[] inputNumbers = new int[input.length];
        for (int i = 0; i < input.length; i++) {
            inputNumbers[i] = Integer.parseInt(input[i]);
        }

        int month = inputNumbers[0];
        int day = inputNumbers[1];
        int year = inputNumbers[2];

        MONTHS.put(1, "January");
        MONTHS.put(2, "February");
        MONTHS.put(3, "March");
        MONTHS.put(4, "April");
        MONTHS.put(5, "May");
        MONTHS.put(6, "June");
        MONTHS.put(7, "July");
        MONTHS.put(8, "August");
        MONTHS.put(9, "September");
        MONTHS.put(10, "October");
        MONTHS.put(11, "November");
        MONTHS.put(12, "December");

        for(Integer currentKey : MONTHS.keySet()) {
            if (currentKey == month)
                monthString = MONTHS.get(currentKey);
            else
                throw new MonthException();
        }

        if (THIRTY_DAY_MONTHS.contains(month) && day > 30) { //Logic for valid day ranges for months that only contain 30 days
            throw new DayException();
        } else if (day > 31 || day <= 0) { //Logic for max and min # of possible days per any month
            throw new DayException();
        } else if (month == 2 && day > 29 && year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) { //Logic for # of days in February for a leap year
            throw new DayException();
        } else if (year < 1000 || year > 3000) { //Logic for valid range of years
            throw new YearException();
        }

        System.out.println(monthString + ' ' + day + ", " + year);


    } catch (MonthException | DayException | YearException e) {
        System.out.println(e.getMessage());
    }
  }
}     

我将12/25/2000之类的东西分成整数12、25和2000,并将它们设置为monthdayyear 但是,当我尝试将currentKey与month值进行比较时,它总是抛出MonthException ,我不确定为什么。 我尝试使用entrySet获取键和值,但是得到的结果相同。

我想发生的是循环迭代,直到currentKey等于输入的month ,然后将monthString设置monthString键的值。

您可以将for循环替换为

monthString = MONTHS.get(month);
if (monthString == null) {
    throw new MonthException();
}

如果在地图中找不到键,则其中的MonthString将为null,从而触发MonthException。

只看你的代码

for(Integer currentKey : MONTHS.keySet()) {
    if (currentKey == month) // this line may cause the problem
        monthString = MONTHS.get(currentKey);
    else
        throw new MonthException();
}

你应该用

if(currentKey.equals(month)) 

为什么在这里需要for循环?

你可以用

monthString = MONTHS.get(month);

现在,如果monthString=null ,则可以引发异常。

monthString = MONTHS.get(month);
if (monthString == null) {
 throw new MonthException();
}

如果谓词失败,则else块在第一次迭代中运行。 您只想在遍历整个地图后才抛出异常。

for(Integer currentKey : MONTHS.keySet()) {
    if (currentKey == month) {
        monthString = MONTHS.get(currentKey);
        break;
    }
    else if (currentKey != month && currentKey == 12)
        throw new MonthException();
}

如果地图较大,则无需循环较慢的地图。 您可以像这样使用containsKey方法:

    if(MONTHS.containsKey(month))
    {
        monthString = MONTHS.get(month);
    }
    else
    {
        throw new MonthException();
    }

引发异常的原因,这会中断循环;

更改您的代码,并在循环之后添加throws子句,如下所示...

   /**      after you code...  **/
    boolean notfound=true;
    for (Integer currentKey : MONTHS.keySet()) {
        String monthString;
        System.out.println("test.main()"+currentKey+month);
        if (currentKey.equals(month)){
         monthString = MONTHS.get(currentKey);
         notfound=false;


    }

}
    if(notfound)            
        throw new Exception();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM