دستگرمی سوم

دستگرمی این هفته:
خروجی کد جاوای زیر چیست؟
import java.util.Arrays;
import java.util.Comparator;
import java.util.EnumSet;
import java.util.List;
import java.util.stream.Collectors;
public class Program {
public static void main(String[] args) {
String[] dates = {"123/AGU/1", "2018/jun/04", "98/04/23", "1398/FeB/01"};
List<Month> months = Arrays.stream(dates)
.filter(date -> date.matches("^\\d{2,4}\\/[a-zA-Z]+\\/\\d{2}"))
.map(Program::get)
.sorted(Comparator.comparingInt(Month::getNum).reversed())
.collect(Collectors.toList());
Month month = months.get(0);
switch (month) {
case JAN:
case FEB:
case MAR:
System.out.print("winter ");
break;
case APR:
case MAY:
case JUN:
System.out.print("spring ");
default:
System.out.print("summer ");
}
}
private static Month get(String date) {
int i1 = date.indexOf("/"), i2 = date.lastIndexOf("/");
String monName = date.substring(i1 + 1, i2);
return EnumSet.allOf(Month.class).stream().
filter(m -> m.name().equalsIgnoreCase(monName)).findFirst().get();
}
}
enum Month {
JAN(1), FEB(2), MAR(3), APR(4), MAY(5), JUN(6),
JUL(7), AGU(8), SEP(9), OCT(10), NOV(11), DES(12);
public final int num;
public int getNum() {
return num;
}
Month(int num) {
this.num = num;
}
}
به نظر شما، خروجی کد بالا کدام گزینه است؟
- spring summer (50%, 4 رای)
- summer (38%, 3 رای)
- sprint (13%, 1 رای)
- winter (0%, 0 رای)
- winter summer (0%, 0 رای)
مجموع رای ها: 8
پاسخ:
پاسخ صحیح: spring summer
برای رسیدن به پاسخ صحیح، متد main را خط به خط بررسی میکنیم:
خط 3: چهار تاریخ ورودی، در قالب String در آرایه dates ریخته میشوند.
خط 4: ابتدا یک stream از dates ساخته میشود و
خط 5: آیتمهای stream بر اساس عبارت منظمِ دادهشده فیلتر میشوند. دقت کنید که طبق این عبارت منظم:
- ماه، فقط باید شامل حروف کوچک و بزرگ انگلیسی باشد. بنابراین 98/04/23 از stream حذف میشود.
- سال فقط باید شامل دو یا چهار عدد باشد. بنابراین
123/AGU/1
نیز از stream حذف میشود.
بنابراین آیتمهای زیر از این فیلتر عبور میکنند:
123/AUG/1, 1398/FeB/01
خط 6: آیتمهای فیلترشده، به یکی از آیتمهایMonth Enum نگاشت میشوند.
- متد استاتیک get، یک تاریخ در ورودی میگیرد و Enum مرتبط با ماهِ آن تاریخ را بر میگرداند.
- عبارت allOf(Month.class)، در واقع یک Set شامل آیتمهای موجود در Enum ورودی را به ما میدهد که میشود از روی آن stream ساخته و کارهای مختلفی کرد.
آیتمهای موجود در stream پس از نگاشت:
JUN, FEB
خط 7: enumها بر اساس شماره ماهشان به ترتیب نزولی مرتب میشوند. اجزای Stream عبارتاند از:
JUN, FEB
خط 8: اجزای stream به لیست months ریخته میشوند.
خط 9: month = JUN میشود.
خط 10: عبارت switch (JUN) ارزیابی شده و اجرای برنامه به خط 18 میرود.
خط 19: عبارت spring در کنسول چاپ میشود. سپس بخش default اجرا میشود.
خط 20: عبارت summer در کنسول چاپ میشود.
.
.
.
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers




کاش یه مقاله ای درمورد Reg ها معرفی کنید بنده فکر میکردم d{2,4} به معنی بین ۲ تا ۴ عدد باشه
سلام
چشم حتما.