2013-09-06 1 views
1

를 사용하여 중첩 된지도에 중첩 된 항목을 제거합니다 "? 그래서 저는 비슷한 것을 찾고 있습니다 MapUtil.remove(map,"employee.address.city")는 어떻게 중첩지도, 이런 식으로 뭔가를 점 표기법

+1

'문자열'을 나눈 다음 '지도'를 탐색하면됩니다. 이것은'Map '를 사용할 필요가 있음을 의미합니다. 왜 3 개의 중첩 된'Map'이 필요한가요? 'Object'가 실패하는 것처럼 들립니다. –

+0

아웃 오브 더 박스는 아니지만, 실제 맵 값으로 펑키 한 것을하지 않는 한 단순한 재귀 함수입니다. OGNL, MVEL, EL 3 등과 같은 EL (Expression Language)을 사용할 수도 있지만, 이것이 유일한 유스 케이스라면 조금 부피가 커 보인다. –

+0

@BoristheSpider 중첩 된 맵은 Jackson에서 JSON 파일의 비 직렬화로 생성됩니다. – Suneel

답변

1

하지 기본적으로, 아니,이 같은 String.split("\\.")를 사용하여 확장 된 맵 키를 구문 분석하는 자신에게 방법을 쓸 수 있지만 :

public void nestedRemove(Map map, String keyToRemove) 
{ 
    String string = "employee.address.city"; 
    String[] keys = string.split("\\."); 
    Map subMap = null; 
    for(int i = 0; i < keys.length -1; i++) 
    { 
     subMap = subMap.get(keys[i]); 
    } 
    subMap.remove(keys[i]); 
} 
+1

반복마다 'if'를 사용하는 이유는 무엇입니까? 루프를'for (i = 0; i

+0

@BoristheSpider 좋은 지적. 코드가 변경되었습니다. – StormeHawke

0

상당한 양의 캐스팅에 의지해야하지만 자신 만의 방법으로 작성할 수 있습니다. 마지막 부분에 도달 할 때까지 get을 계속 호출하고 (다음 단계의 결과를 기억하는 것) 계속 remove으로 전화 할 것입니다. null 반환을 확인하는 것을 잊지 마십시오. 모든 단계에서 get

제 3 자 라이브러리에 내장 된 내용을 모르겠다. 물론 그게 이 아니며,이 아닙니다.

3

자바 8 라이브러리를 Dynamics이 작업을 수행 할 수는 중첩 된지도/수집을 래핑 (다른 유형들 사이에서) 구조를 허용하고 정적 유형 지정없이 널 허용 추론을 허용합니다. 우리는 우리의 동적 인스턴스를 얻기 위해지도를 포장

Dynamic.from(map).get("employee").get("address").asMap().remove("city"); 

는 #get 지금은 그 아이의 아이, 또는 부재를 나타내는 다른 동적 인스턴스를 반환합니다. 따라서 이것은 null-safe합니다. 우리는 또한 많은으로 얻을 분할 #dget 사용하고, 아마도 직원 또는 주소가 예외없이 존재하지 않는 경우 처리 #maybe 수의 편의를 위해

:

Dynamic.from(map).dget("employee.address") 
    .maybe().asMap() 
    .ifPresent(address -> address.remove("city")); 

더 예를 참조를 https://github.com/alexheretic/dynamics

관련 문제