سؤال

وهذا أمر سيء بالنسبة لي..أنا رجل PHP أعمل في Java في مشروع JSP.أعرف كيف أفعل ما أحاول من خلال الكثير من التعليمات البرمجية والافتقار التام إلى الجودة.

أفضل أن أفعل ذلك بشكل صحيح.هنا هو الوضع:

أنا أكتب عرضًا صغيرًا لأوضح للعملاء الأيام التي يمكنهم فيها سقي مروجهم بناءً على مجموعة الري الخاصة بهم (ABCDE) وفي أي وقت من العام.مواسمنا تبدو هكذا:الصيف (5-1 إلى 8-31) الربيع (3-1 إلى 4-30) الخريف (9-1 إلى 10-31) الشتاء (11-1 إلى 2-28)

على سبيل المثال قد يكون:

إذا كنت في المجموعة أ، فإليك الأوقات المسموحة لي:شتاء:الاثنين فقط الربيع:الثلاثاء ، الخميس ، السبت الصيف:أي يوم يسقط:الثلاثاء، الخميس، السبت

إذا كنت أكتب هذا في PHP سأستخدم صفائف مثل هذا:

//M=Monday,t=Tuesday,T=Thursday.... etc
$schedule["A"]["Winter"]='M';
$schedule["A"]["Spring"]='tTS';
$schedule["A"]["Summer"]='Any';
$schedule["A"]["Fall"]='tTS';
$schedule["B"]["Winter"]='t';

يمكنني إنشاء مصفوفات الأيام (مصفوفة ("الثلاثاء"، "الخميس"، "السبت")) وما إلى ذلك، لكن هذا ليس ضروريًا لما أحاول تحقيقه حقًا.

سأحتاج أيضًا إلى إعداد المصفوفات لتحديد الموسم الذي أتواجد فيه:

$seasons["Summer"]["start"]=0501;
$seasons["Summer"]["end"]=0801;

هل يمكن لأي شخص أن يقترح طريقة رائعة حقًا للقيام بذلك؟سيكون لدي تاريخ اليوم والرسالة الجماعية.سأحتاج إلى الخروج من وظيفتي يومًا (M) أو سلسلة من الأيام (تحويل النص إلى كلام)، (أي).

هل كانت مفيدة؟

المحلول

يمكنك فعل نفس الكود بشكل أساسي باستخدام Hashtables (أو بعض الخرائط الأخرى):

Hashtable<String, Hashtable<String, String>> schedule
    = new Hashtable<String, Hashtable<String, String>>();
schedule.put("A", new Hashtable<String, String>());
schedule.put("B", new Hashtable<String, String>());
schedule.put("C", new Hashtable<String, String>());
schedule.put("D", new Hashtable<String, String>());
schedule.put("E", new Hashtable<String, String>());

schedule.get("A").put("Winter", "M");
schedule.get("A").put("Spring", "tTS");
// Etc...

ليست أنيقة، ولكن مرة أخرى، Java ليست لغة ديناميكية، ولا تحتوي على تجزئات على مستوى اللغة.

ملحوظة:ربما تكون قادرًا على تقديم حل أفضل، وقد خطر هذا في ذهني عندما قرأت سؤالك.

نصائح أخرى

لا تحاول أن تكون ديناميكيًا مثل PHP.يمكنك أن تحاول أولا يُعرِّف ماذا تحتاج.

interface Season
{
    public string getDays();
}

interface User
{
    public Season getWinter();
    public Season getSpring();
    public Season getSummer();
    public Season getFall();
}

interface UserMap
{
    public User getUser(string name);
}

ويرجى قراءة وثائق جدول التجزئة قبل استخدامه.تتم مزامنة هذه الفئة مما يعني أن كل مكالمة محمية ضد تعدد العمليات مما يؤدي إلى إبطاء الوصول عندما لا تحتاج إلى الحماية الإضافية.الرجاء استخدام أي خريطة التنفيذ بدلا من ذلك مثل خريطة التجزئة أو خريطة الشجرة.

يبدو أن الجميع يحاول العثور على طريقة Java للقيام بذلك كما لو كنت تفعل ذلك في PHP، بدلاً من الطريقة التي ينبغي القيام بها في Java.ما عليك سوى اعتبار كل جزء من المصفوفة كائنًا، أو على الأقل المستوى الأول من المصفوفة ككائن وكل مستوى فرعي كمتغيرات داخل الكائن.قم بإنشاء بنية بيانات تقوم بملءها بالكائنات المذكورة والوصول إلى الكائنات من خلال أدوات الوصول المحددة لبنية البيانات.

شيء مثل:

class Schedule
{
  private String group;
  private String season;
  private String rundays;
  public Schedule() { this.group = null; this.season = null; this.rundays= null; }
  public void setGroup(String g) { this.group = g; }
  public String getGroup() { return this.group; }
  ...
}

public ArrayList<Schedule> schedules = new ArrayList<Schedule>();
Schedule s = new Schedule();
s.setGroup(...);
...
schedules.add(s);
...

بالطبع ربما لا يكون هذا صحيحًا أيضًا.سأجعل من كل موسم شيئًا، وربما أجعل كل قائمة من أيام الأسبوع بمثابة كائن أيضًا.على أي حال، من السهل إعادة استخدامه وفهمه وقابليته للتوسعة أكثر من Hashtable المتعثر الذي يحاول تقليد كود PHP الخاص بك.بالطبع، تحتوي PHP على كائنات أيضًا، ويجب عليك استخدامها بطريقة مماثلة بدلاً من المصفوفات الخاصة بك، حيثما كان ذلك ممكنًا.أنا أفهم إغراء الغش، رغم ذلك.PHP يجعل الأمر سهلاً وممتعًا للغاية!

وإليك طريقة واحدة لذلك استطاع انظر، يمكنك معرفة الباقي:

A = new Group();
A.getSeason(Seasons.WINTER).addDay(Days.MONDAY);
A.getSeason(Seasons.SPRING).addDay(Days.TUESDAY).addDay(Days.THURSDAY);
A.getSeason(Seasons.SPRING).addDays(Days.MONDAY, Days.TUESDAY, ...);

schedule = new Schedule();
schedule.addWateringGroup( A );

أنا لست مبرمج جافا، ولكن الابتعاد عن جافا والتفكير فقط في مصطلحات أكثر حيادًا عن اللغة - قد تكون الطريقة الأنظف للقيام بذلك هي استخدام الثوابت أو الأنواع المذكورة.يجب أن يعمل هذا في أي لغة تدعم المصفوفات متعددة الأبعاد.

في حالة استخدام الثوابت المسماة، على سبيل المثال:

int A = 0;
int B = 1;
int C = 2;
int D = 3;

int Spring = 0; 
int Summer = 1;
int Winter = 2; 
int Fall = 3;
...

ثم تعمل الثوابت كمصفوفة أكثر قابلية للقراءة:

schedule[A][Winter]="M";
schedule[A][Spring]="tTS";
schedule[A][Summer]="Any";
schedule[A][Fall]="tTS";
schedule[B][Winter]="t";

استخدام الأنواع المذكورة:

enum groups
{
  A = 0,
  B = 1,
  C = 2,
  D = 3
}

enum seasons
{
  Spring = 0,
  Summer = 1,
  Fall = 2,
  Winter = 3
}
...
schedule[groups.A][seasons.Winter]="M";
schedule[groups.A][seasons.Spring]="tTS";
schedule[groups.A][seasons.Summer]="Any";
schedule[groups.A][seasons.Fall]="tTS";
schedule[groups.B][seasons.Winter]="t";

أنا في حيرة من أمري بشأن السبب الذي يجعل البعض منكم يعتقد أن إلقاء مجموعات كبيرة من الأشياء على الكود هو الحل الأمثل.على سبيل المثال، هناك أربعة فصول بالضبط، لكنها ليست كذلك يفعل أو محل أي شئ.كيف يتم تبسيط أي شيء لجعلها أشياء؟وينج محق تمامًا في أن هذه الأمور ربما ينبغي أن تكون كذلك الثوابت (أو ربما التعدادات).

ما يحتاجه بروس، في جوهره، هو مجرد جدول بحث.لا يحتاج إلى تسلسل هرمي للكائنات والواجهات؛إنه يحتاج إلى طريقة للبحث عن جدول زمني يعتمد على الموسم ومعرف المجموعة.إن تحويل الأشياء إلى أشياء يكون منطقيًا فقط إذا كانت لديها مسؤوليات أو دولة.إذا لم يكن لديهم أي منهما، فهي مجرد معرفات، وبناء كائنات خاصة لهم يؤدي فقط إلى زيادة حجم قاعدة التعليمات البرمجية.

أنت استطاع بناء، على سبيل المثال، Group الكائنات التي يحتوي كل منها على مجموعة من سلاسل الجدول الزمني (واحدة لكل موسم)، ولكن إذا كانت جميعها Group الكائن الذي يفعله هو توفير وظيفة البحث، ثم قمت بإعادة اختراع جدول البحث بطريقة أقل سهولة بكثير.إذا كان عليه البحث عن المجموعة، ثم البحث في الجدول الزمني، فكل ما لديه هو جدول بحث من خطوتين استغرق وقتًا أطول في البرمجة، ومن المرجح أن يكون به أخطاء، وسيكون من الصعب صيانته.

أنا مع أولئك الذين يقترحون تغليف الوظيفة في الكائنات.

import java.util.Date;
import java.util.Map;
import java.util.Set;

public class Group {

    private String groupName;

    private Map<Season, Set<Day>> schedule;

    public String getGroupName() {
        return groupName;
    }

    public void setGroupName(String groupName) {
        this.groupName = groupName;
    }

    public Map<Season, Set<Day>> getSchedule() {
        return schedule;
    }

    public void setSchedule(Map<Season, Set<Day>> schedule) {
        this.schedule = schedule;
    }

    public String getScheduleFor(Date date) {
        Season now = Season.getSeason(date);
        Set<Day> days = schedule.get(now);
        return Day.getDaysForDisplay(days);
    }

}

يحرر:كما أن النطاقات الزمنية الخاصة بك لا تأخذ في الاعتبار السنوات الكبيسة:

مواسمنا تبدو هكذا:الصيف (5-1 إلى 8-31) الربيع (3-1 إلى 4-30) الخريف (9-1 إلى 10-31) الشتاء (11-1 إلى 2-28)

أوافق على أنه يجب عليك بالتأكيد وضع هذا المنطق خلف الواجهة النظيفة لـ:

public String lookupDays(String group, String date);

ولكن ربما يجب عليك لصق البيانات في ملف الخصائص.أنا لست ضد ترميز هذه البيانات في ملفاتك المصدرية، ولكن، كما لاحظت، يمكن أن تكون Java كثيرة الكلام عندما يتعلق الأمر بالمجموعات المتداخلة.قد يبدو ملفك كالتالي:

أ.الصيف=م
أ. الربيع = تحويل النص إلى كلام
ب.الصيف=ت

عادةً لا أرغب في نقل البيانات الثابتة مثل هذا إلى ملف خارجي لأنه يزيد "المسافة" بين البيانات والرمز الذي يستخدمها.ومع ذلك، عندما تتعامل مع المجموعات المتداخلة، وخاصة الخرائط، يمكن أن تصبح الأمور قبيحة للغاية وبسرعة كبيرة.

إذا لم تعجبك هذه الفكرة، فربما يمكنك القيام بشيء مثل هذا:

public class WaterScheduler
{
  private static final Map<String, String> GROUP2SEASON = new HashMap<String, String>();
  static
  {
    addEntry("A", "Summer", "M");
    addEntry("A", "Spring", "tTS");
    addEntry("B", "Summer", "T");
  }

  private static void addEntry(String group, String season, String value)
  {
    GROUP2SEASON.put(group + "." + season, value);
  }

}

تفقد بعض سهولة القراءة ولكن على الأقل تكون البيانات أقرب إلى المكان الذي سيتم استخدامها فيها.

هل يجب أن يكون "التاريخ" معلمة؟إذا كنت تعرض جدول الري الحالي فقط، فيمكن لفئة WateringSchedule نفسها معرفة اليوم الحالي، وبالتالي الموسم.ثم لديك فقط طريقة تُرجع خريطة حيث يكون المفتاح هو حرف المجموعة.شيء مثل:

public Map<String,List<String>> getGroupToScheduledDaysMap() {
  // instantiate a date or whatever to decide what Map to return
}

ثم في صفحة JSP

<c:forEach var="day" items="${scheduler.groupToScheduledDaysMap["A"]}">
   ${day}
</c:forEach>

إذا كنت بحاجة إلى إظهار الجداول الزمنية لأكثر من موسم واحد، فيجب أن يكون لديك طريقة في فئة WateringSchedule تقوم بإرجاع خريطة حيث تكون المواسم هي المفاتيح، ثم تكون خرائط groupToScheduledDays هي القيم.

ربما يكون الحل الأفضل هو وضع كل تلك البيانات في قاعدة بيانات، بدلاً من تشفيرها في مصادرك أو استخدام ملفات الخصائص.

سيكون استخدام قاعدة البيانات أسهل بكثير في الصيانة، وهناك متنوع ل حر قاعدة البيانات المحركات للاختيار من بينها.

يتم تنفيذ اثنين من محركات قواعد البيانات هذه بالكامل في Java ويمكن تضمينهما في التطبيق فقط عن طريق تضمين ملف jar.إنها ثقيلة الوزن بعض الشيء، بالتأكيد، ولكنها أكثر قابلية للتطوير وأسهل في الصيانة.لا يعني مجرد وجود 20 سجلًا اليوم أنه لن يكون هناك المزيد لاحقًا بسبب المتطلبات المتغيرة أو زحف الميزات.

إذا قررت، خلال بضعة أسابيع أو أشهر، أنك تريد إضافة قيود الري في وقت معين من اليوم، على سبيل المثال، فسيكون من الأسهل بكثير إضافة هذه الوظيفة إذا كنت تستخدم قاعدة بيانات بالفعل.وحتى لو لم يحدث ذلك مطلقًا، فقد أمضيت بضع ساعات في تعلم كيفية تضمين قاعدة بيانات في أحد التطبيقات.

لا يوجد حل جميل.Java لا تفعل أشياء مثل هذه بشكل جيد.يعد حل مايك هو إلى حد كبير الطريقة للقيام بذلك إذا كنت تريد سلاسل كمؤشرات (مفاتيح).هناك خيار آخر إذا كان إعداد التجزئة قبيحًا للغاية وهو إلحاق السلاسل معًا (سُرقت من Mike بلا خجل وتم تعديلها):

Hashtable<String, String> schedule = new Hashtable<String, String>();
schedule.put("A-Winter", "M");
schedule.put("A-Spring", "tTS");

ثم ابحث:

String val = schedule.get(group + "-" + season);

إذا لم تكن راضيًا عن القبح العام (وأنا لا ألومك)، فضع كل ذلك خلف استدعاء الأسلوب:

String whenCanIWater(String group, Date date) { /* ugliness here */ }

ليرة تركية ؛ د

باستخدام ميزات وفئات لغة Java الحديثة، حدد التعدادات الخاصة بك لتمثيل المواسم والمجموعات.

Schedule.daysForGroupOnDate( 
    Group.D , 
    LocalDate.now()
)  

هذه الطريقة تنتج أ Set ل DayOfWeek كائنات التعداد (وليس مجرد نص!) DayOfWeek.TUESDAY & DayOfWeek.THURSDAY.

جافا الحديثة

هل يمكن لأي شخص أن يقترح طريقة رائعة حقًا للقيام بذلك؟

نعم.

تحتوي Java الحديثة على فئات ومجموعات وتعدادات مدمجة لمساعدتك في حل هذه المشكلة.

ال java.time يوفر إطار العمل المدمج في Java Month التعداد و DayOfWeek التعداد.

ال EnumSet و EnumMap توفير تطبيقات Set و Map التي تم تحسينها للاستخدام مع التعدادات للتنفيذ السريع في ذاكرة قليلة جدًا.

يمكنك تحديد بنفسك التعدادات لتمثيل موسمك ومجموعاتك (أ، ب، وما إلى ذلك).تعد أداة التعداد في Java أكثر فائدة وقوة بكثير من اللغات الأخرى.إذا لم تكن مألوفة، راجع أوراكل البرنامج التعليمي.

إن التركيب البسيط لتعريف التعدادات الخاصة بك يوفر في الواقع الكثير من الوظائف اللازمة لحل هذه المشكلة، مما يلغي بعض التعليمات البرمجية المعقدة.جديد بناء الجملة الحرفي للمجموعات والخرائط في طرق تجميع المصانع في جافا 9 (جيب 269) يجعل الكود أكثر بساطة الآن.

هنا هو التطبيق العمل الكامل. لاحظ كم هو قليل من التعليمات البرمجية هناك للخوارزميات.يؤدي تحديد التعدادات المخصصة الخاصة بك إلى تنفيذ معظم المهام الثقيلة.

تحذير واحد مع رمز التطبيق هذا:فهو يفترض أنه لن يتغير أي شيء في تعريفات عملك، أو على الأقل إذا كان هناك تغيير يهمك فقط القواعد الحالية، فإن "الأحدث هو الأعظم".إذا تغيرت قواعدك بمرور الوقت وتحتاج إلى تمثيل جميع الإصدارات السابقة والحالية والمستقبلية، فسأقوم بإنشاء تطبيق مختلف تمامًا، ربما مع قاعدة بيانات لتخزين القواعد.ولكن هذا التطبيق هنا يحل السؤال كما هو مطلوب.

Season

تمثيل الموسم الخاص بك باعتباره التعداد Season.يحمل كل كائن موسم List ل Month تعداد الكائنات التي تحدد طول هذا الموسم المعين.الجديد List.of يحدد بناء الجملة المضاف إلى Java 9 قائمة غير قابلة للتغيير في بناء جملة حرفي عبر أساليب المصنع الثابتة.

package com.basilbourque.watering;

import java.time.LocalDate;
import java.time.Month;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;

public enum Season
{
    SPRING( List.of( Month.MARCH , Month.APRIL ) ),
    SUMMER( List.of( Month.MAY , Month.JUNE, Month.JULY , Month.AUGUST ) ),
    FALL( List.of( Month.SEPTEMBER , Month.OCTOBER ) ),
    WINTER( List.of( Month.NOVEMBER , Month.DECEMBER , Month.JANUARY , Month.FEBRUARY ) );

    private List< Month > months;

    // Constructor
    Season ( List < Month > monthsArg )
    {
        this.months = monthsArg;
    }

    public List < Month > getMonths ( )
    {
        return this.months;
    }

    // For any given month, determine the season.
    static public Season ofLocalMonth ( Month monthArg )
    {
        Season s = null;
        for ( Season season : EnumSet.allOf( Season.class ) )
        {
            if ( season.getMonths().contains( monthArg ) )
            {
                s = season;
                break; // Bail out of this FOR loop.
            }
        }
        return s;
    }

    // For any given date, determine the season.
    static public Season ofLocalDate ( LocalDate localDateArg )
    {
        Month month = localDateArg.getMonth();
        Season s = Season.ofLocalMonth( month );
        return s;
    }

    // Run `main` for demo/testing.
    public static void main ( String[] args )
    {
        // Dump all these enum objects to console.
        for ( Season season : EnumSet.allOf( Season.class ) )
        {
            System.out.println( "Season: " + season.toString() + " = " + season.getMonths() );
        }
    }
}

Group

قم بتمثيل كل مجموعة من مروج/ساحات العملاء (A، B، C، D، E) كتعداد مسمى Group.يحمل كل كائن من هذه الكائنات التعداد ملفًا Map, ، رسم الخرائط أ Season كائن التعداد ل Set ل DayOfWeek كائنات التعداد.على سبيل المثال، Group.A في Season.SPRING يسمح بالسقي لمدة يومين ، DayOfWeek.TUESDAY & DayOfWeek.THURSDAY.

package com.basilbourque.watering;

import java.time.DayOfWeek;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.Map;
import java.util.Set;

public enum Group
{
    A(
            Map.of(
                    Season.SPRING , EnumSet.of( DayOfWeek.TUESDAY , DayOfWeek.THURSDAY ) ,
                    Season.SUMMER , EnumSet.allOf( DayOfWeek.class ) ,
                    Season.FALL , EnumSet.of( DayOfWeek.TUESDAY , DayOfWeek.THURSDAY ) ,
                    Season.WINTER , EnumSet.of( DayOfWeek.TUESDAY )
            )
    ),
    B(
            Map.of(
                    Season.SPRING , EnumSet.of( DayOfWeek.FRIDAY ) ,
                    Season.SUMMER , EnumSet.allOf( DayOfWeek.class ) ,
                    Season.FALL , EnumSet.of( DayOfWeek.TUESDAY , DayOfWeek.FRIDAY ) ,
                    Season.WINTER , EnumSet.of( DayOfWeek.FRIDAY )
            )
    ),
    C(
            Map.of(
                    Season.SPRING , EnumSet.of( DayOfWeek.MONDAY ) ,
                    Season.SUMMER , EnumSet.allOf( DayOfWeek.class ) ,
                    Season.FALL , EnumSet.of( DayOfWeek.MONDAY , DayOfWeek.TUESDAY ) ,
                    Season.WINTER , EnumSet.of( DayOfWeek.MONDAY )
            )
    ),
    D(
            Map.of(
                    Season.SPRING , EnumSet.of( DayOfWeek.WEDNESDAY , DayOfWeek.FRIDAY ) ,
                    Season.SUMMER , EnumSet.allOf( DayOfWeek.class ) ,
                    Season.FALL , EnumSet.of( DayOfWeek.FRIDAY ) ,
                    Season.WINTER , EnumSet.of( DayOfWeek.WEDNESDAY )
            )
    ),
    E(
            Map.of(
                    Season.SPRING , EnumSet.of( DayOfWeek.TUESDAY ) ,
                    Season.SUMMER , EnumSet.allOf( DayOfWeek.class ) ,
                    Season.FALL , EnumSet.of( DayOfWeek.TUESDAY , DayOfWeek.WEDNESDAY ) ,
                    Season.WINTER , EnumSet.of( DayOfWeek.WEDNESDAY )
            )
    );

    private Map < Season, Set < DayOfWeek > > map;

    // Constructor
    Group ( Map < Season, Set < DayOfWeek > > mapArg )
    {
        this.map = mapArg;
    }

    // Getter
    private Map < Season, Set < DayOfWeek > > getMapOfSeasonToDaysOfWeek() {
        return this.map ;
    }

    // Retrieve the DayOfWeek set for this particular Group.
    public Set<DayOfWeek> daysForSeason (Season season ) {
        Set<DayOfWeek> days =   this.map.get( season ) ; // Retrieve the value (set of days) for this key (a season) for this particular grouping of lawns/yards.
        return days;
    }



    // Run `main` for demo/testing.
    public static void main ( String[] args )
    {
        // Dump all these enum objects to console.
        for ( Group group : EnumSet.allOf( Group.class ) )
        {
            System.out.println( "Group: " + group.toString() + " = " + group.getMapOfSeasonToDaysOfWeek() );
        }
    }

}

Schedule

اجمع كل ذلك معًا في هذا Schedule فصل.

يستخدم هذا الفصل التعدادين المحددين أعلاه لإنجاز عمل مفيد.الطريقة الوحيدة المطبقة حتى الآن تخبرك بأيام الأسبوع المسموح بها لمجموعة معينة في تاريخ معين.الطريقة تحدد أي Season ينطبق على ذلك التاريخ.

تشغيل main الطريقة هنا لتفريغ محتويات التعدادين لدينا، وتقديم تقرير عن أيام الأسبوع التي تسمح بالري في كل مجموعة لتاريخ محدد مشفر.

package com.basilbourque.watering;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoField;
import java.time.temporal.IsoFields;
import java.util.EnumSet;
import java.util.Set;

public class Schedule
{
    static private DateTimeFormatter isoWeekFormatter = DateTimeFormatter.ofPattern( "uuuu-'W'ww" ) ;

    static public Set < DayOfWeek > daysForGroupOnDate ( Group group , LocalDate localDate )
    {
        Season season = Season.ofLocalDate( localDate );
        Set < DayOfWeek > days = group.daysForSeason( season );
        return days;
    }

    // Run `main` for demo/testing.
    public static void main ( String[] args )
    {
        Season.main( null  );
        Group.main( null  );
        // Dump all these enum objects to console.
        for ( Group group : EnumSet.allOf( Group.class ) )
        {
            LocalDate localDate = LocalDate.now( ZoneId.of( "Africa/Tunis" ) );
            Set < DayOfWeek > days = Schedule.daysForGroupOnDate( group , localDate );
            String week = localDate.format( Schedule.isoWeekFormatter  ) ; // Standard ISO 8601 week, where week number one has the first Thursday of the calendar year, and week starts on Monday, so year is either 52 or 53 weeks long.
            String message = "Group " + group + " – Watering days on " + localDate + " week # " + week + " is: " + days;
            System.out.println( message );
        }
    }
}

وحدة التحكم

عند الجري Schedule.main, ، نرى هذا ملقاة على وحدة التحكم.

موسم:الربيع = [مارس، أبريل]

موسم:الصيف = [مايو، يونيو، يوليو، أغسطس]

موسم:الخريف = [سبتمبر، أكتوبر]

موسم:الشتاء = [نوفمبر، ديسمبر، يناير، فبراير]

مجموعة:A = {الربيع=[الثلاثاء، الخميس]، الخريف=[الثلاثاء، الخميس]، الصيف=[الاثنين، الثلاثاء، الأربعاء، الخميس، الجمعة، السبت، الأحد]، الشتاء=[الثلاثاء]}

مجموعة:ب = {الربيع=[الجمعة]، الخريف=[الثلاثاء، الجمعة]، الصيف=[الاثنين، الثلاثاء، الأربعاء، الخميس، الجمعة، السبت، الأحد]، الشتاء=[الجمعة]}

مجموعة:C = {الربيع=[الاثنين]، الخريف=[الاثنين، الثلاثاء]، الصيف=[الاثنين، الثلاثاء، الأربعاء، الخميس، الجمعة، السبت، الأحد]، الشتاء=[الاثنين]}

مجموعة:D = {الربيع=[الأربعاء، الجمعة]، الخريف=[الجمعة]، الصيف=[الاثنين، الثلاثاء، الأربعاء، الخميس، الجمعة، السبت، الأحد]، الشتاء=[الأربعاء]}

مجموعة:E = {الربيع=[الثلاثاء]، الخريف=[الثلاثاء، الأربعاء]، الصيف=[الاثنين، الثلاثاء، الأربعاء، الخميس، الجمعة، السبت، الأحد]، الشتاء=[الأربعاء]}

المجموعة أ – أيام الري في 2018-01-30 الأسبوع رقم 2018-W05 هي:[يوم الثلاثاء]

المجموعة ب – أيام الري في 2018-01-30 الأسبوع رقم 2018-W05 هي:[جمعة]

المجموعة ج – أيام الري في 2018-01-30 الأسبوع رقم 2018-W05 هي:[الاثنين]

المجموعة د – أيام الري في 2018-01-30 الأسبوع رقم 2018-W05 هي:[الأربعاء]

المجموعة هـ – أيام الري في 2018-01-30 الأسبوع رقم 2018-W05 هي:[الأربعاء]

أسبوع ISO 8601

قد تجد أنه من المفيد التعرف على ايزو 8601 معيار ل تعريف الاسبوع.يعطي المعيار معنى محددًا لـ "الأسبوع" ويحدد تنسيقًا نصيًا لتمثيل أسبوع معين أو يوم معين خلال ذلك الأسبوع.

للعمل مع مثل هذه الأسابيع داخل Java، فكر في إضافة ملف ثلاثة عشرة اضافية مكتبة لمشروعك للاستفادة من YearWeek فصل.

LocalDate

ال LocalDate تمثل الفئة قيمة التاريخ فقط بدون الوقت من اليوم وبدون المنطقة الزمنية.

المنطقة الزمنية أمر بالغ الأهمية في تحديد التاريخ.في أي لحظة، يختلف التاريخ حول العالم حسب المنطقة.على سبيل المثال، بعد دقائق قليلة من منتصف الليل باريس، فرنسا هو يوم جديد بينما لا يزال "الأمس" في مونتريال، كيبيك.

إذا لم يتم تحديد منطقة زمنية، فسيطبق JVM ضمنيًا منطقته الزمنية الافتراضية الحالية.قد يتغير هذا الإعداد الافتراضي في أي لحظة، لذلك قد تختلف نتائجك.من الأفضل تحديد المنطقة الزمنية المطلوبة/المتوقعة بشكل صريح كوسيطة.

حدد أ اسم المنطقة الزمنية المناسبة في شكل continent/region, ، مثل America/Montreal, Africa/Casablanca, ، أو Pacific/Auckland.لا تستخدم أبدًا الاختصار المكون من 3-4 أحرف مثل EST أو IST كما هم لا مناطق زمنية حقيقية، غير موحدة، وليست فريدة حتى (!).

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

إذا كنت تريد استخدام المنطقة الزمنية الافتراضية الحالية لـ JVM، فاطلبها وقم بالتمرير كوسيطة.إذا تم حذفه، فسيتم تطبيق الإعداد الافتراضي الحالي لـ JVM ضمنيًا.من الأفضل أن تكون صريحاً.

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

أو تحديد تاريخ.يمكنك ضبط الشهر برقم، مع ترقيم معقول من 1 إلى 12 للفترة من يناير إلى ديسمبر.

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

أو الأفضل استخدام Month كائنات التعداد محددة مسبقًا، واحدة لكل شهر من شهور السنة.نصيحة:استخدم هذه Month الكائنات في جميع أنحاء قاعدة التعليمات البرمجية الخاصة بك بدلاً من مجرد رقم صحيح لجعل التعليمات البرمجية الخاصة بك أكثر توثيقًا ذاتيًا، وضمان القيم الصحيحة، وتوفير سلامة النوع.

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

مجموعات غير قابلة للتغيير

يجب أن تكون القوائم والمجموعات والخرائط الموضحة أعلاه مجموعات غير قابلة للتغيير، حيث من المحتمل أن يكون تغيير عضوية تلك المجموعات مربكًا وخاطئًا.

بناء جملة جافا 9 الجديد List.of و Map.of لقد وعدوا بالفعل بأن يكونوا غير قابلين للتغيير.ومع ذلك، في حالتنا Map ينبغي أن يكون مثاليا EnumMap لكفاءة الأداء والذاكرة.التنفيذ الحالي ل Map.of و Set.of على ما يبدو لا تكتشف استخدام التعدادات كأعضاء ويتم تحسينها تلقائيًا باستخدام داخلي لـ EnumMap و EnumSet.هناك قضية OpenJDK مفتوحة للنظر في مثل هذه القضايا: فكر في إدخال تحسينات على EnumMap وEnumSet.

إحدى الطرق للحصول على EnumSet غير القابل للتغيير وEnumMap غير القابل للتغيير هي من خلال جوجل الجوافة مكتبة:

نتائج كل استخدام الأساسية EnumSet/EnumMap.عمليات مثل get و put رمي استثناء.حتى تحصل على التحسينات المتعلقة بالتعداد إلى جانب الثبات.

هنا Season و Group تم تعديل الفئات الموضحة أعلاه لاستخدام مكتبة Google Guava 23.6.

Season مع الثبات

package com.basilbourque.watering;

import java.time.LocalDate;
import java.time.Month;
import java.util.EnumSet;
import java.util.List;

public enum Season
{
    SPRING( List.of( Month.MARCH , Month.APRIL ) ),  // `List.of` provides literals-style syntax, and returns an immutable `List`. New in Java 9.
    SUMMER( List.of( Month.MAY , Month.JUNE, Month.JULY , Month.AUGUST ) ),
    FALL( List.of( Month.SEPTEMBER , Month.OCTOBER ) ),
    WINTER( List.of( Month.NOVEMBER , Month.DECEMBER , Month.JANUARY , Month.FEBRUARY ) );

    private List< Month > months;

    // Constructor
    Season ( List < Month > monthsArg )
    {
        this.months = monthsArg;
    }

    public List < Month > getMonths ( )
    {
        return this.months;
    }

    // For any given month, determine the season.
    static public Season ofLocalMonth ( Month monthArg )
    {
        Season s = null;
        for ( Season season : EnumSet.allOf( Season.class ) )
        {
            if ( season.getMonths().contains( monthArg ) )
            {
                s = season;
                break; // Bail out of this FOR loop.
            }
        }
        return s;
    }

    // For any given date, determine the season.
    static public Season ofLocalDate ( LocalDate localDateArg )
    {
        Month month = localDateArg.getMonth();
        Season s = Season.ofLocalMonth( month );
        return s;
    }

    // Run `main` for demo/testing.
    public static void main ( String[] args )
    {
        // Dump all these enum objects to console.
        for ( Season season : EnumSet.allOf( Season.class ) )
        {
            System.out.println( "Season: " + season.toString() + " = " + season.getMonths() );
        }
    }
}

Group مع الثبات

package com.basilbourque.watering;

import com.google.common.collect.Maps;
import com.google.common.collect.Sets;

import java.time.DayOfWeek;
import java.util.EnumSet;
import java.util.Map;
import java.util.Set;

public enum Group
{
    A(
            Maps.immutableEnumMap(
                    Map.of(  // `Map.of` provides literals-style syntax, and returns an immutable `Map`. New in Java 9.
                            Season.SPRING , Sets.immutableEnumSet( DayOfWeek.TUESDAY , DayOfWeek.THURSDAY ) ,
                            Season.SUMMER , Sets.immutableEnumSet( EnumSet.allOf( DayOfWeek.class ) ) ,
                            Season.FALL , Sets.immutableEnumSet( DayOfWeek.TUESDAY , DayOfWeek.THURSDAY ) ,
                            Season.WINTER , Sets.immutableEnumSet( DayOfWeek.TUESDAY )
                    )
            )
    ),

    B(
            Maps.immutableEnumMap(
                    Map.of(
                            Season.SPRING , Sets.immutableEnumSet( DayOfWeek.FRIDAY ) ,
                            Season.SUMMER , Sets.immutableEnumSet( EnumSet.allOf( DayOfWeek.class ) ) ,
                            Season.FALL , Sets.immutableEnumSet( DayOfWeek.TUESDAY , DayOfWeek.FRIDAY ) ,
                            Season.WINTER , Sets.immutableEnumSet( DayOfWeek.FRIDAY )
                    )
            )
    ),

    C(
            Maps.immutableEnumMap(
                    Map.of(
                            Season.SPRING , Sets.immutableEnumSet( DayOfWeek.MONDAY ) ,
                            Season.SUMMER , Sets.immutableEnumSet( EnumSet.allOf( DayOfWeek.class ) ) ,
                            Season.FALL , Sets.immutableEnumSet( DayOfWeek.MONDAY , DayOfWeek.TUESDAY ) ,
                            Season.WINTER , Sets.immutableEnumSet( DayOfWeek.MONDAY )
                    )
            )
    ),

    D(
            Maps.immutableEnumMap(
                    Map.of(
                            Season.SPRING , Sets.immutableEnumSet( DayOfWeek.WEDNESDAY , DayOfWeek.FRIDAY ) ,
                            Season.SUMMER , Sets.immutableEnumSet( EnumSet.allOf( DayOfWeek.class ) ) ,
                            Season.FALL , Sets.immutableEnumSet( DayOfWeek.FRIDAY ) ,
                            Season.WINTER , Sets.immutableEnumSet( DayOfWeek.WEDNESDAY )
                    )
            )
    ),

    E(
            Maps.immutableEnumMap(
                    Map.of(
                            Season.SPRING , Sets.immutableEnumSet( DayOfWeek.TUESDAY ) ,
                            Season.SUMMER , Sets.immutableEnumSet( EnumSet.allOf( DayOfWeek.class ) ) ,
                            Season.FALL , Sets.immutableEnumSet( EnumSet.of( DayOfWeek.TUESDAY , DayOfWeek.WEDNESDAY ) ) ,
                            Season.WINTER , Sets.immutableEnumSet( DayOfWeek.WEDNESDAY )
                    )
            )
    );

    private Map < Season, Set < DayOfWeek > > map;

    // Constructor
    Group ( Map < Season, Set < DayOfWeek > > mapArg )
    {
        this.map = mapArg;
    }

    // Getter
    private Map < Season, Set < DayOfWeek > > getMapOfSeasonToDaysOfWeek ( )
    {
        return this.map;
    }

    // Retrieve the DayOfWeek set for this particular Group.
    public Set < DayOfWeek > daysForSeason ( Season season )
    {
        Set < DayOfWeek > days = this.map.get( season ); // Retrieve the value (set of days) for this key (a season) for this particular grouping of lawns/yards.
        return days;
    }

    // Run `main` for demo/testing.
    public static void main ( String[] args )
    {
        // Dump all these enum objects to console.
        for ( Group group : EnumSet.allOf( Group.class ) )
        {
            System.out.println( "Group: " + group.toString() + " = " + group.getMapOfSeasonToDaysOfWeek() );
        }
    }

}

حول جافا.تايم

ال java.time إطار العمل مدمج في Java 8 والإصدارات الأحدث.تحل هذه الفئات محل الفئات القديمة المزعجة إرث فئات التاريخ والوقت مثل java.util.Date, Calendar, & SimpleDateFormat.

ال جودا تايم المشروع، الآن في نمط الصيانة, ، ينصح بالهجرة إلى java.time الطبقات.

لمعرفة المزيد، راجع أوراكل البرنامج التعليمي.وابحث في Stack Overflow عن العديد من الأمثلة والشروحات.المواصفات هي جي إس آر 310.

أين يمكن الحصول على دروس Java.time؟

ال ثلاثة عشرة اضافية يقوم المشروع بتوسيع Java.time بفئات إضافية.يعد هذا المشروع بمثابة أرض اختبار للإضافات المستقبلية المحتملة إلى java.time.قد تجد بعض الفئات المفيدة هنا مثل Interval, YearWeek, YearQuarter, ، و أكثر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top