문제

이것은 불쾌한 한 나를 위해...나 PHP 남자에서 작업에 Java JSP 프로젝트입니다.내가 수행하는 방법을 알고 내가 하려고 너무 많이를 통해 코드의 전체 부족 finesse.

부를 확인하세요합니다.여기에는 상황:

쓰고 있어요 작은 전시하여 고객에게 어떤 일들을 할 수 있습 물의 잔디밭에 따라 그들의 물을 그룹(가)그리고 무엇이 올해의 시간입니다.우리의 사계절은 다음과 같이 보여름(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';

내가 만들 수 있는 일을 배열(array("토요일","화요일","토요일"))등,하지만 그것은 필요하지 않은 것에 대해 나는 정말 노력을 수행할 수 있습니다.

나는 것이 또한 필요를 설정 배열을 확인하이 무엇 시즌에서 난:

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

할 수 있는 누군가는 건 정말 멋진 방식으로 하면 이렇게 할 수 있습니까?저는 오늘의 날과 그룹에 편지입니다.요 내 기능이 일(M)또는 시리즈의 일(tTS),(모든).

도움이 되었습니까?

해결책

당신이 할 수있는 기본적으로 동일한 코드와 해시 테이블(또는 다른 Map):

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);
}

고 읽어 보시기 바랍의 문서 Hashtable 기 전에 그것을 사용하고 있다.이 클래스에 동기화되는 것을 의미하는 각 통화에 대하여 보호되는 다중 스레딩되는 정말로 느리게 액세스할 때 필요하지 않습을 보호할 수 있습니다.어떤 사용하십시오 지도 구현 대신 다음과 같 HashMap트리맵.

그것은 모두 같아를 찾기 위해 노력하 Java 그것을 할 수있는 방법처럼 당신이 그것을 하는 PHP 에서 대신의 방법으로 해야 그것을 할 수 있습니다.그냥 고려의 각 부분의 배열체,또는,적어도,첫 번째 수준의 배열을 개체 및 각 하위 단계로 변수를 안다.을 구축하는 데이터 구조를 채우라고 말했다 개체 개체에 액세스를 통해 데이터 구조물의 부여 줍니다.

다음과 같습니다.

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);
...

물론 아마 옳지 않다.에서만 만날 수 있는 각 계절체,그리고 어쩌면 각 요일 목록으로는 너무 개체.어쨌든,그것의 더 쉽게 다시 사용,이해,그리고 확장 가능한보다 절 함께 있는 해시 테이블을 모방하려고 당신의 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 );

나는 Java 프로그래머지만,점점 멀리서 자바고 생각하는 측면에서는 더 많은 언어가 관계없-기 그것을 할 수있는 방법도 사용될 수 있거나 상수하거나 열거된 형식입니다.이 작업에 어떤 언어를 지원하는 다중 차원 배열입니다.

를 사용하는 경우 이름이 지정된 상수,위치,예를 들어:

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";

나는 완전히 손실에 왜 당신의 일부라고 생각하는 것 같을 던지고 수병에 있는 오브젝트 코드는 방법입니다.예를 들어,정확히 네 시즌,그리고 그들은하지 않는 저장소 니다.어떻게 그것도 그들을까?날개이 바로 이러한 이야 상수 (또는 어쩌면 열거).

무엇 브루스 요구에서,그것의 중심,단순 조회이다.그는 필요하지 않의 계층 구조체와 인터페이스그가 필요로 하는 방법을 찾기 일정에 기반 시즌과 그룹을 식별자입니다.도는 것으로 객체에만 의미가 있을 경우 그 책임 또는 상태입니다.있는 경우에도,그들은 단순히 식별자 및 구축에 대한 개체들을 만 codebase 큽니다.

당신 을 구축,예를 들어, 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 될 수 있습니다 아주 말을 때 그것을 중첩된 컬렉션이 있습니다.파일을 수도 있습처럼 보인:

A. 여름=M
A. 봄=tTS
B. 여름=T

일반적으로 좋아하지 않는 이동을 정적 데이터는 다음과 같이 외부 파일이 증가하기 때문에"거리"사과 데이터를 사용하는 코드.그러나 때마다,당신과 함께 다루고 있어 중첩된 컬렉션,특히 지도 물건을 얻을 수 있습 실시,추악한다.

지 않는 경우 다음과 같이 아이디어,어쩌면 당신은 다음과 같이 할 수 있다:

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);
  }

}

일부를 잃고 가독성 하지만 적어도 데이터가 있는 곳에 가까이 가 사용할 수 있습니다.

는"date"을 매개 변수는?만약 당신이 그냥 보여주는 현재 물을 예약 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 는 값입니다.

더 나은 솔루션을 것입되는 모든 데이터베이스에 데이터,하드 코딩하는 대신에 그것의 원본 또는 속성을 사용하여 파일이 있습니다.

데이터베이스를 사용하는 것이 훨씬 쉬울 것이 유지하고,거기에 다양성 무료 데이터베이스 엔진을 선택할 수 있습니다.

두 가지의 이러한 데이터베이스 엔진은 전적으로 자바로 구현 및에 포함될 수 있는 응용 프로그램을 포함하여 jar 파일입니다.그것은 작은 헤비급,확지만,그것은 더 많은 확장 가능하고 유지하기 쉽습니다.단지 때문에 있는 20 개의 레코드가 오늘 의미하지 않는 없을 것이 더 나중에 때문에 요구 사항의 변화나 기능에 크리프입니다.

는 경우,에서 몇 주 또는 몇 개월 동안,당신은 결정을 추가하려는 말,하루 중 시간에 물을 제한,그것은 훨씬 쉽게 될 것입니다 그 기능을 추가를 이미 사용하고 있는 경우에는 데이터베이스입니다.그런 경우가 아니더라도,당신은 몇 시간을 보냈는 방법을 학습을 포함하는 데이터베이스에서 응용 프로그램입니다.

이 없 꽤 솔루션입니다.Java 하지 않는 것 같습니다.마이크 솔루션은 거의 그것을 할 수있는 방법 당신이 원하는 문자열을 이수(키).또 다른 옵션의 경우 해시의 해시 설정이 너무 추을 추가 함께 문자열(뻔뻔스럽게 도난에서 마이크하고 수정):

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 */ }

tl;박사

를 사용하여 현대 Java 언어의 기능과 클래스 정의의 열거를 나타내고 그룹이 있습니다.

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

는 방법을 산출 SetDayOfWeek enum 체(단순한 텍스트를!), 과 같이 DayOfWeek.TUESDAY & DayOfWeek.THURSDAY.

현대 Java

할 수 있는 누군가는 건 정말 멋진 방식으로 하면 이렇게 할 수 있습니까?

그렇습니다.

현대 Java 가 내장 클래스 콜렉션,그리고 왜냐하면 도움이 이 문제를 해결합니다.

java.시간 framework 내장 Java 제공 Month enum 과 DayOfWeek enum.

EnumSetEnumMap 제공의 구현 SetMap 최적화된 사용을 위해 열거를 위한 빨리 실행에서 매우 작은 메모리를 차지한다.

정의할 수 있습니다 당신의 자신 열거형 을 나타내고 그룹(A,B,so on).Enum 시설에서 Java 훨씬 더 유용하고 강력한 보다 다른 언어로도 제공됩니다.익숙하지 않은 경우,표시 Oracle 튜토리얼.

간단한 구문을 정의하는 자신의 왜냐하면 실제로 제공하는 많은 기능을 해결하는 데 필요한 이 질문을 제거,일부 복잡한 코딩이다.뉴 리터럴 구문 에 대한 세트 맵 컬렉션 공장 방법 Java9(JEP269 이)코드도 간단하다.

여기에는 완전한 작업 응용 프로그램이 있습니다. 참고 어떻게 작은 코드 가를 위한 알고리즘이 있습니다.정의 사용자 지정 열거가의 대부분이 무거운 들기입니다.

주의할 점이 응용 프로그램 코드:가정 아무것도 변하지 않 귀하의 비즈니스에 정의를,또는 적어도의 변경이 있는 경우만 관리에 대해 현재의 규칙"최신이 가장 큰".하는 경우 규칙 변경을 통해 시간은 당신을 나타내는 필요한 모든 과거,현재,미래전,나를 구축할 것이 매우 다른 응용 프로그램,아마 데이터베이스를 저장하는 규칙이 있습니다.하지만 이 앱은 여기에 문제를 해결니다.

Season

을 나타내기로 열거 Season.각 시즌 개체 보유 ListMonth 열거하는 개체의 길이를 정의하는 특정 계절이다.새로운 List.of 구문을 추가하 Java9 정의 변경할 수 없는 목록에서 리터럴 구문을 통해 정적 공장에 방법이 있습니다.

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, 매핑 a Season enum 개체 SetDayOfWeek enum 개체입니다.예를 들어, Group.ASeason.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, 우리는 이 덤프습니다.

시즌:봄=[월,APRIL]

시즌:여름=[MAY,JUNE,JULY,AUGUST]

시즌:가을=[월,월]

시즌:겨울=[NOVEMBER,DECEMBER,JANUARY,FEBRUARY]

그룹:A={봄=[화요일,목요일],가을=[화요일,목요일],여름=[월요일,화요일,화요일,목요일,금요일,토요일,일요일],겨울=[월요일]}

그룹:B={봄=[금요일],가을=[월요일,금요일],여름=[월요일,화요일,화요일,목요일,금요일,토요일,일요일],겨울=[금요일]}

그룹:C={봄=[월요일],가을=[월요일,화요일],여름=[월요일,화요일,화요일,목요일,금요일,토요일,일요일],겨울=[월요일]}

그룹:D={봄=[수요일,금요일],가을=[금요일],여름=[월요일,화요일,화요일,목요일,금요일,토요일,일요일],겨울=[월요일]}

그룹:E={봄=[월요일],가을=[월요일,수요일,금요일],여름=[월요일,화요일,화요일,목요일,금요일,토요일,일요일],겨울=[월요일]}

그룹 A–급수에 일 2018-01-30 주#2018-W05 입니다:[월요일]

그룹 B–물에 일 2018-01-30 주#2018-W05 입니다:[월요일]

C–급수에 일 2018-01-30 주#2018-W05 입니다:[월요일]

그룹 D–급수에 일 2018-01-30 주#2018-W05 입니다:[월요일]

E–급수에 일 2018-01-30 주#2018-W05 입니다:[월요일]

ISO8601 주

당신은 그것을 찾을 수 있습니다움에 대해 배울 ISO8601 에 대한 표준 의 정의 주간.이 표준은 특별한 의미하는"주"를 정의하는 텍스트 형식으로 나타내는 특정 주거나 특정한 날에 주입니다.

에 대한 작업은 주 내에서 Java 를 추가하십시오 ThreeTen-추가 라이브러리 프로젝트를 이용하의 YearWeek 클래스입니다.

LocalDate

LocalDate 클래스를 나타내는 날짜만 값없이 시간과 시간이없는 영역입니다.

시간 영역을 결정하는 중요한 날짜.주어진 순간,날짜 변화에 의해 전 세계적으로 영역입니다.예를 들어,몇 분에서 자정 이후 파리 프랑스 은 새로운 날 동안은 여전히"어제에서" 몬트리올 Québec.

지 않은 경우 시간대를 지정하 JVM 암시적으로 적용되는 현재의 기본 표준 시간대.는 기본값이 변경될 수 있습에 어느 순간,그래서 당신의 결과가 달라질 수 있습니다.더하여 지정한 당신의 원/예상 시간 영역으로 명시적으로 인수입니다.

지정 적절한 시간대 이름 에서의 형식 continent/region, 와 같은 America/Montreal, Africa/Casablanca, 나 Pacific/Auckland.사용하지 않는 3-4 문자 약어 등 ESTIST 진실한 시간 영역의 표준화되지 않고,심지어 고유(!).

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 enum 체를 미리 정의된 하나씩 있다.팁:이 Month 체 코드 베이스가 아닌 단순한 정수 번호하는 코드를 더욱 자기 문서화하는지 확인하는 유효한 값,그리고 제공 유형-안전.

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

불변의 컬렉션

목록 설정하고,지도 위에서 보는 것이 이상적 불변의 컬렉션을 변경하는 등 회원의 컬렉션가 될 가능성이 혼동하고 잘못된 것입니다.

새로운 자바 9 구문 List.ofMap.of 는 이 약속을 변경할 수 없습니다.그러나 우리는 경우 Map 는 것이 이상적입 EnumMap 효율성에 대한의 성과와 메모리입니다.의 현재 구현 Map.ofSet.of 분명히지 않의 사용을 감지 열거형으로 회원이 자동으로 최적화와 내부의 사용 EnumMapEnumSet.가 OpenJDK 문제가 열리면 이러한 문제를 고려해 볼: 고려한 개선 사항을 EnumMap 및 EnumSet.

방법 중 하나를 변경할 수 없 EnumSet 및 변경 불가능을 통해 EnumMap 구글은 구아바 라이브러리:

결과의 각 사용하는 기본 EnumSet/EnumMap.과 같은 작업 getput 니다.그래서 당신을 얻을 열거 관련 최적화와 함께 불변성.

여기에는 SeasonGroup 클래스를 볼 수정을 사용하여 Google 과바 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.시간

java.시간 프레임워크 구축으로 Java8 니다.이러한 클래스를 대신한 귀찮은 옛 레거시 날짜간와 같은 클래스 java.util.Date, Calendar, & SimpleDateFormat.

Joda 간 프로젝트에 지금 정비 모드, 지 마이그레이션 java.시간 클래스입니다.

자세한 내용은 다음을 참조하세요합 Oracle 튜토리얼.검색 Stack Overflow 에 대한 많은 예제 및 설명이 있습니다.사양 JSR310.

어디를 구하 java.시간 클래스가?

ThreeTen-추가 프로젝트 확장 java.시간으로 추가됩니다.이 프로젝트는 시험장에 대한 가능한 미래를 추가하 java.시간입니다.당신이 찾을 수 있습니다 몇 가지 유용한 클래스가 여기에 등 Interval, YearWeek, YearQuarter, 고 more.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top