2017-02-02 10 views

답변

1

sortedBy 함수는 본문으로 표현 된 조건과 각 수집 된 결과 간의 < 관계를 사용하여 요소를 정렬합니다. 당신이 surname 속성이 있다고 가정 귀하의 경우에는

, 다음 명령문은 (문자열에 그래서 <) 각 성에서 < 연산자를 사용하여 컬렉션 c 모여 정렬합니다 :

c->sortedBy(p | p.surname) 

아이디어를 수 성에 연결되어있는 성을 사용하여 고유 한 문자열을 계산하는 것입니다. 경우에 따라서, 당신은 :

  • 조지 스미스
  • 게리 스미스
  • 조지 Smath
  • 비교는 "Smith_George", "Smith_Garry"와 "Smath_George"와 것 사이에 수행 될 수

  1. 조지 Smath (SM 톤 : 때문에, 사전 편찬 순서에 따라, 주문 h_George)
  2. 게리 스미스 (Smith_G RRY)
  3. 조지 스미스 (smith_G 전자 ORGE)

마지막으로, OCL 요청() 기존의 속성으로 surnamename 가정이 될 것입니다 :

c->sortedBy(p | p.surname + '_' + p.name) 

이 작은 트릭이 작업을 수행하지만 sortedBy의 두 매개 변수 비교와 정확히 일치하지는 않습니다.

+0

이 솔루션은 모든 경우에 작동하지 않습니다 나에게 보인다 (sortedBy 선언적 명확하고 컴팩트 한 작은 비효율적이기 때문에/사소한 구현은 (자신의 종류를 최적화 할 수 있습니다) 나는 뭔가가 필요해. ersal. 예를 들어 두 개의 날짜가있는 경우이 솔루션은 잘못 될 것입니다. 예를 들어, 프로젝트가 시작된 날짜와 프로젝트가 끝난 날짜입니다. 그런 경우 무엇을 사용할 수 있습니까? – DM14

+0

내가 말했듯이,이 솔루션은 이름/성을 사용하는 특정 경우에 사전 식 순서를 사용합니다. 확실하지는 않지만 OCL sortedBy 함수가이 두 가지 기준 검색을 수행 할 수 있다고 생각하지 않습니다. 다른 경우에는 시작/종료 날짜 예에서 다른 종점을 찾아야합니다. 종료/시작 날짜를 사용하여 각 프로젝트에서 소비 한 시간을 계산하고이 기준을 사용하여 정렬 할 수 있습니다. 그렇지 않으면, yyy-mm-dd 형식으로 날짜를 번역하면 (기호가 0이면), 사전 식 순서가있는 문자열 트릭이 작동해야합니다. –

0

OCL sortedBy (lambda)는 분류 기준으로 객체를 투영해야하는 Java의 정렬 (비교 자)과 매우 다른 것처럼 보입니다. 그러나 프로젝션이 자체 일 경우 다른 Java 기능을 사용할 수 있습니다. 그러므로 sortedBy (p | p)를 수행하면 정렬은 p에 대한 < 연산에 따라 달라집니다.

향후 OCL의 Eclipse OCL 프로토 타입에는 사용자 정의 유형이 OclComparable 유형을 확장하는 경우 모든 관계형 작업을 실현할 수 있도록 compareTo 메소드가있는 OclComparable 유형이 도입됩니다.

(제로와 유사한 OclSummable()과 합계() 운영 컬렉션 :: 합계를 (지원) 일반적으로;. 예를 들어, 문자열이 연결로 합을 실현)

0

감사 당신은 내게 영감을. 방금 http://issues.omg.org/browse/OCL25-213의 텍스트를 다음과 같이 올렸습니다.

sortedBy 반복은 정렬 메트릭이 정렬 된 객체의 투영 인 정렬 문제에 우아한 해결책을 제공합니다. 따라서 sortedBy (p | p.name) 또는 sortedBy (name)는 짧고 두 객체의 비교를 포함하는보다 일반적인 표현에서 오타가 생길 기회를 피할 수 있습니다.자연스러운 해법은 중요하지 않은 메트릭스를 가진 대규모 콜렉션을위한 효율적인 솔루션 일 수 있습니다.

그러나 sortedBy 솔루션은 익숙하지 않으므로 신입 사원에게는 혼란스럽고 인공 화합물 단일 키를 구성해야하는 다중 키 정렬에는 적합하지 않습니다. |하자 diff1 = p1.key1.compareTo

종류 (P1, P2 : 두 개의 키 종류를 허용 |

하나의 해결책은 같은 종류 (비교 표현 P1, P2)와 같은보다 전통적인 반복자를 제공 할 수 있습니다 에서 (p2.key1 있으면) diff1 <> 0 1 DIFF 다른 p1.key2.compareTo (p2.key2) ENDIF)

그러나이 불량 가독성 오타 대한 충분한 기회가있다.

sortedBy (튜플 {제 = KEY1, 초 = 키 2})

(튜플 부 명의 알파벳 순서가 결정 터플 값 메트릭

대안 sortedBy 같이 여러 키를 지원할 수도 우선 순위입니다.)

등가물.)