我有两个int
个变量monthFrom
和monthUntil
代表一个区间。我想写一个方法,可以找出冬季月份是否与这个区间重叠。例如,如果monthFrom == 3
,monthUntil == 5
,则方法将返回false
,如果monthFrom == 2
,monthUntil == 8
- true
,则{{1} },monthFrom == 10
- monthUntil= = 3
,等等。
作为Java的初学者,我不知道该怎么做。有什么帮助吗?
答案 0 :(得分:2)
Joe我的代码可以帮助您解决问题。 我使用HashMap Collection来存储月份的值,因为它包含对应于值的固定月份数,即月份名称。
在下面找到我的代码
public class FindWinterMonth {
HashMap<Integer, String> months = null;
public FindWinterMonth() {
months = new HashMap<Integer, String>();
months.put(10, "October");
months.put(11, "November");
months.put(12, "December");
months.put(1, "January");
months.put(2, "Febuary");
}
public boolean isWinterMonth(int monthFrom, int monthUntil){
boolean isPresent = false;
for(int i = monthFrom; i <= monthUntil; i++){
if(months.containsKey(i)){
isPresent = true;
}
}
return isPresent;
}
public static void main(String[] args) {
FindWinterMonth fm = new FindWinterMonth();
boolean isWinter = fm.isWinterMonth(4,9);
System.out.println(isWinter);
}
}
我相信它可以帮助您,如果有人有好的和有效的解决方案与我们分享。 谢谢!
答案 1 :(得分:0)
您可以使用以下代码:
if (monthFrom <= monthUntil && monthUntil != 12 && monthFrom >= 3)
return false;
else
return true;
或者您可以像这样简化此代码:
return !(monthFrom <= monthUntil && monthUntil != 12 && monthFrom >= 3);
答案 2 :(得分:0)
根据提供的规则,给定的代码应该产生所需的输出:
public static void main(String[] args){
isWinter(3,5);
isWinter(2,8);
isWinter(10,3);
}
public static void isWinter(int monthFrom, int monthUntil) {
if(monthFrom <= monthUntil && monthFrom < 3 ||
monthFrom > monthUntil && monthUntil <= 3) {
System.out.println("Winter time");
} else {
System.out.println("Not winter time");
}
}
O / P
Not winter time
Winter time
Winter time
在monthUntil <= 3
monthFrom > monthUntil
或monthFrom < 3
monthFrom < monthUntil
时isWinter(3,5);
时,该检查适用冬季规则。
由于没有明确的定义,我认为false
必须返回isWinter(10,3);
和true
的规则必须返回import pexpect
cmd = "ssh -o StrictHostKeyChecking=no %s -l %s" % (<host>, <user>)
exp = pexpect.spawn(cmd, timeout=7)
idx = exp.expect('assword:')
nc = exp.sendline(<passwd>)
idx = exp.expect('[\n\r](#|\$) ')
if idx == 0:
before = exp.before
print before
。
答案 3 :(得分:0)
我知道你是一名Java初学者,你现在想要掌握基础知识。这是件好事,我鼓励你继续。
尽管如此,你应该避免在更高级的程序中弄乱基本级别的时间相关代码。时间是一个微妙的话题,几代程序员花费了数小时和数周的时间来使其在Java中易于管理。如果您已经使用Java 8,则包java.time中有一个复杂的日期时间API。
此外,您可能需要检查项目Interval
中的ThreeTen-Extra。它提供了计算间隔之间重叠的方法。
答案 4 :(得分:0)
最好使用对象而不仅仅是整数。这使您的代码更加自我记录,确保有效值,并提供类型安全。
Month
几个月来,Java提供了Month
类。作为Enum
,该类预先定义了十几个对象,每月一个,1月到12月为1-12。
EnumSet
EnumSet
是Set
的特殊实现,已针对保存枚举对象进行了优化。 EnumSet
对象碰巧执行起来非常快,内存非常小。用它来将“冬天”定义为一组月份。
Set<Month> winter = EnumSet.of ( Month.DECEMBER , Month.JANUARY , Month.FEBRUARY );
至于您的月份范围,请将其定义为EnumSet
。实例化很容易,因为类提供了range
方法。
//Set<Month> range = EnumSet.range ( Month.of ( 3 ) , Month.of ( 5 ) );
Set<Month> range = EnumSet.range ( Month.of ( 2 ) , Month.of ( 8 ) );
接下来,我们需要知道range
集中的任何元素是否都在winter
集中。不幸的是,containsAny
界面中没有Set
种方法。我们可以通过更多代码获取该行为,创建winter
的副本,然后调用removeAll
以删除range
中包含的所有匹配元素,最后与原始{{1}进行比较}}
winter
或者,创建一组共同的冬季月份并询问该集合是否为非空。
Set<Month> winterMonthsNotInRange = EnumSet.copyOf ( winter );
winterMonthsNotInRange.removeAll ( range );
Boolean rangeContainsWinterMonths = ( ! winter.equals ( winterMonthsNotInRange ) ); // If different, the range contained one or more winter months.
转储到控制台。
Set<Month> winterMonthsInRange = EnumSet.copyOf ( winter );
winterMonthsInRange.removeAll ( winterMonthsNotInRange );
Boolean rangeContainsWinterMonths = ( winterMonthsInRange.size() > 0 );
System.out.println ( "winter: " + winter );
System.out.println ( "range: " + range );
System.out.println ( "winterMonthsNotInRange: " + winterMonthsNotInRange );
System.out.println ( "rangeContainsWinterMonths: " + rangeContainsWinterMonths );
System.out.println ( "winterMonthsInRange: " + winterMonthsInRange );
winter: [JANUARY, FEBRUARY, DECEMBER]
range: [FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST]
winterMonthsNotInRange: [JANUARY, DECEMBER]
rangeContainsWinterMonths: true
winterMonthsInRange: [FEBRUARY]
请记住,这些不是仅仅是正在使用的字符串。 Month
个对象是真实的OOP对象,其中包含数据和方法。您在上面的输出中看到的全大写名称是由Enum::toString
方法生成的String对象。您也可以通过Month::getDisplayName
方法生成自动本地化为其他语言的字符串,例如1月份的法语Month
。
如果不熟悉Java枚举工具,请研究Oracle Tutorial。它们比其他语言的枚举更强大,但非常易于使用且非常方便。
请记住,您可以在代码周围传递这些janvier
个对象和Month
/ EnumSet
个对象。尽量减少使用纯粹整数表示月份的位置。
提示: