دستگرمی سوم

دستگرمی این هفته:
خروجی کد جاوای زیر چیست؟
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | 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 را خط به خط بررسی میکنیم:
خط ۳: چهار تاریخ ورودی، در قالب String در آرایه dates ریخته میشوند.
خط ۴: ابتدا یک stream از dates ساخته میشود و
خط ۵: آیتمهای stream بر اساس عبارت منظمِ دادهشده فیلتر میشوند. دقت کنید که طبق این عبارت منظم:
- ماه، فقط باید شامل حروف کوچک و بزرگ انگلیسی باشد. بنابراین ۹۸/۰۴/۲۳ از stream حذف میشود.
- سال فقط باید شامل دو یا چهار عدد باشد. بنابراین
۱۲۳/AGU/1
نیز از stream حذف میشود.
بنابراین آیتمهای زیر از این فیلتر عبور میکنند:
۱۲۳/AUG/1, 1398/FeB/01
خط ۶: آیتمهای فیلترشده، به یکی از آیتمهایMonth Enum نگاشت میشوند.
- متد استاتیک get، یک تاریخ در ورودی میگیرد و Enum مرتبط با ماهِ آن تاریخ را بر میگرداند.
- عبارت allOf(Month.class)، در واقع یک Set شامل آیتمهای موجود در Enum ورودی را به ما میدهد که میشود از روی آن stream ساخته و کارهای مختلفی کرد.
آیتمهای موجود در stream پس از نگاشت:
JUN, FEB
خط ۷: enumها بر اساس شماره ماهشان به ترتیب نزولی مرتب میشوند. اجزای Stream عبارتاند از:
JUN, FEB
خط ۸: اجزای stream به لیست months ریخته میشوند.
خط ۹: month = JUN میشود.
خط ۱۰: عبارت switch (JUN) ارزیابی شده و اجرای برنامه به خط ۱۸ میرود.
خط ۱۹: عبارت spring در کنسول چاپ میشود. سپس بخش default اجرا میشود.
خط ۲۰: عبارت summer در کنسول چاپ میشود.
.
.
.
آدرس کانال تلگرام: JavaCupIR@
آدرس اکانت توییتر: JavaCupIR@
آدرس صفحه اینستاگرام: javacup.ir
آدرس گروه لینکدین: Iranian Java Developers
کاش یه مقاله ای درمورد Reg ها معرفی کنید بنده فکر میکردم d{2,4} به معنی بین ۲ تا ۴ عدد باشه
سلام
چشم حتما.