[英]How to go through hashmap and compare key or value to scanner input?
[英]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,并将它们设置为month
, day
和year
。 但是,当我尝试将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.