دستگرمی

دستگرمی سوم

دستگرمی این هفته:

خروجی کد جاوای زیر چیست؟

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

Loading ... Loading ...

پاسخ:

پاسخ صحیح: 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

نوشته های مشابه

‫2 دیدگاه ها

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

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا