2016-10-14 9 views
0

자바 응용 프로그램으로 주문하려면 특정 필드와 관련된지도를 주문해야합니다.Java에서 필드 값 (Comparator 사용)에 따라이 Map을 어떻게 정렬 할 수 있습니까?

그래서 나는 다음과 같은 상황이, 내 프로그램에 내가이 의 HashMap 목적이 있습니다 다음 채워집니다

Map<Integer, QuotaTir> mappaQuote = new HashMap<Integer, QuotaTir>(); 

합니다 (DB에서 데이터를 획득를, 이것은 중요하지 않다). 객체가 이있는 경우

public class QuotaTir implements Cloneable, Comparator<QuotaTir>, Comparable<QuotaTir> { 

    private String numeroPolizza;    // Identificatio univoco polizza 
    private String tipo;      // Operazion effettuata (Es: 99 ---> Sottoscrizione polizza) 
    private String datariferimentoprezzo; 
    private String codiceFondo; 
    private BigDecimal controvalore;   // Usato per calcolare l'andamento della polizza in un intervallo di tempo 
    private BigDecimal quote; 
    private int contarighe; 

    // CONSTRUCTORS, GETTERS AND SETTERS METHODS 

    public int compare(QuotaTir quota1, QuotaTir quota2) { 

     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

     Date quota1Date = null; 
     Date quota2Date = null; 

     try { 
      quota1Date = sdf.parse(quota1.getDatariferimentoprezzo()); 
      quota2Date = sdf.parse(quota2.getDatariferimentoprezzo()); 

      if (quota1Date.before(quota2Date)) { 
       return -1; 
      } else if (quota1Date.after(quota2Date)) { 
       return 1; 
      } else { 
       return 0; 
      }  


     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return 2;  // ERROR CASE 
    } 
} 

이전 클래스가 비교 구현 당신이 볼 수 있듯이 (QuotaTir의 quota1, QuotaTir의 quota2) 방법 말 :

QuotaTir 객체의 코드 datariferimentoprezzo
필드 < = 다른 객체의 동일한 필드에 (이 문자열 정보를 프로퍼티 날짜로 변환해야하므로 필드 유형을 변경할 수 없습니다.)

{ 
0=QuotaTir [numeroPolizza=12345, tipo=AttualeCVT, datariferimentoprezzo=2016-10-13, codiceFondo=null, controvalore=4887172.119733, quote=595128.54995, contarighe=0], 
1=QuotaTir [numeroPolizza=12345, tipo=InizialeCVT, datariferimentoprezzo=2015-12-31, codiceFondo=null, controvalore=-100058.840000, quote=100058.84000, contarighe=1], 
2=QuotaTir [numeroPolizza=12345, tipo=99, datariferimentoprezzo=2016-01-28, codiceFondo=null, controvalore=-80000.000000, quote=5515.20890, contarighe=2], 
4=QuotaTir [numeroPolizza=12345, tipo=99, datariferimentoprezzo=2016-04-08, codiceFondo=null, controvalore=-20000.000000, quote=2094.46015, contarighe=4] 
3=QuotaTir [numeroPolizza=12345, tipo=XPRE, datariferimentoprezzo=2016-01-28, codiceFondo=null, controvalore=-20000.000000, quote=20000.00000, contarighe=3], 

} 

그래서 내가 이전 QuotaTirdatariferimentoprezzo 필드의 값을 사용하여 이전 비교기 (사용하여 이러한 항목을 주문합니다 : 내 이전 mappaQuote HashMap의이 같은 것을 포함 있도록

확인 수업). **

나는 내가 의 HashMap를 사용할 수 있다고 생각하지만 난 LinkedMap 또는 *의 트리 맵으로 변환해야합니다.

어떻게하면됩니까? datariferimentoprezzo 필드에 따라 올바르게 주문할 수 있습니까?

+0

확인 예 "값 2. 정렬"에서 https://www.mkyong.com/java/how-to-sort-a-map-in-java /. – saurav

답변

0

Java8 용으로 사용해보십시오.

TreeMap<QuotaTir, Integer> result = mappaQuote.entrySet().stream() 
    .collect(() -> new TreeMap<>(mappaQuote.values().iterator().next()), 
     (m, e) -> m.put(e.getValue(), e.getKey()), (m, n) -> m.putAll(n)); 

또는

TreeMap<QuotaTir, Integer> result = new TreeMap<>(
    mappaQuote.values().iterator().next()); 
for (Entry<Integer, QuotaTir> e : mappaQuote.entrySet()) 
    result.put(e.getValue(), e.getKey()); 
+0

자바 6에 좋다? – AndreaNobili

+0

@AndreaNobili Ok. – saka1029

+0

그래, 이건 나에게 좋지 않아 .--( – AndreaNobili