2016-06-19 5 views
-2

배열의 값 합계를 & 그룹화하려고합니다. 아래 표시된 데이터에서 추가 비용 열 아래의 값은 날짜 - 노트 조합 &에 대해 다른 목록에 저장해야 합니다.자바 - 람다를 사용한 그룹화 및 합계

나는 Link1Link2 & Link3을 언급했지만 내가하고있는 실수를 알 수 없습니다. 내게 직면 한 문제가 분명하고, 지침을 기다리고 있기를 바랍니다.

데이터 (엑셀에서 읽기) :

  • 날짜 | 참고 번호 | 할증료
  • 29 년 1 월 29 일 | 1234 | 12.2
  • 29 년 1 월 29 일 | 1234 | 10.5
  • 28-1 월 20 일 | 2468 | 9.25
  • 28-1 월 20 일 | 2468 | 14.4
  • 28-1 월 | 2468 | 13.3
  • 27-1 월 -2016 | 1357 | 17.2
  • 27-1 월 2016 | 1357 | 18.7

코드 데이터 모델 :

public class ModelSurcharge { 
private LocalDate cNoteDate; 
private int cNote; 
private double surcharge; 

public ModelBrokerage(LocalDate cNoteDate, int cNote, double surcharge) { 
    this.cNoteDate = cNoteDate; 
    this.cNote = cNote; 
    this.surcharge= surcharge; 
} 

public LocalDate getcNoteDate() { 
    return cNoteDate; 
} 

public int getcNote() { 
    return cNote; 
} 

public double getSurcharge() { 
    return surcharge; 
} 
} 

코드 Main 클래스 :

File fileCNote = null; 
try { 
    fileCNote = new File("c:/surcharge.xlsx"); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
// Read data from excel file 
List<List<XSSFCell>> dataSurcharge = iFaceXLSX.readData(fileCNote); 
// Skip header line & filter out rows which do not have surcharge amount 
dataSurcharge = dataSurcharge .stream().skip(1).filter(p -> p.get(6).getNumericCellValue() > 0).collect(Collectors.toList()); 

// Transfer data read from excel to the data model 
List<ModelSurcharge> surcharges= new ArrayList<>(); 
dataSurcharge.forEach(e -> { 
    List<ModelSurcharge> temp = Arrays.asList(new ModelSurcharge(
       e.get(0).getDateCellValue().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(), 
       (int) e.get(1).getNumericCellValue(), 
       (e.get(3).getNumericCellValue() + e.get(4).getNumericCellValue()) * e.get(6).getNumericCellValue())); 
     surcharges.addAll(temp); 
    }); 

//Output to console 
    surcharges.stream().collect(groupingBy(Function.identity(), 
      ()->new TreeMap<>(
        Comparator.<ModelSurcharge,LocalDate>comparing(p->p.getcNoteDate()).thenComparing(p->p.getcNote())), 
      Collectors.summingDouble(foo->foo.getSurcharge()))) 
      .forEach((group,surcharge) -> 
        System.out.println(group.getcNoteDate()+"\t"+group.getcNote()+"\t"+surcharge)); 

// Collecting to another list does not work 
List<ModelSurcharge> output = surcharges.stream() 
      .collect(groupingBy(p -> p.getcNoteDate(), Collectors.summingDouble(p -> p.getSurcharge()))); 

오류 : 그것은이 있기 때문에

Cannot resolve method 'getcNoteDate()' 
Cannot resolve method 'getSurcharge()' 
+0

모든 링크와 관련성이없는 코드를 제거하고 관련 코드 만 제공하여 질문을 단순화하고 명확하게 해주십시오 : ModelSurcharge 클래스, 컴파일되지 않는 코드를 보여주는 완전하지만 최소한의 예제, 완전한 컴파일러 오류 메시지? –

+0

@JBNizet 본인은 귀하가 통지 한대로 변경했습니다. 필요한 정보를 제공하고 내가 직면 한 문제가 더 분명 할 수 있기를 바랍니다. 죄송합니다 & 포럼 – iCoder

답변

2

귀하의 ModelSurcharge 클래스는, 컴파일되지 않습니다 생성자 이름은 ModelBrokerage입니다. 주 코드의 시작 부분도 컴파일되지 않습니다. File 생성자는 절대로 IOException을 throw하지 않습니다.

그러나 전체 컴파일의 문제는 훨씬 더 간결하고 외부 라이브러리의 의존성이없는 다음 코드로 줄일 수 있습니다

public class ModelSurcharge { 
    private LocalDate cNoteDate; 
    private int cNote; 
    private double surcharge; 

    public ModelSurcharge(LocalDate cNoteDate, int cNote, double surcharge) { 
     this.cNoteDate = cNoteDate; 
     this.cNote = cNote; 
     this.surcharge = surcharge; 
    } 

    public LocalDate getcNoteDate() { 
     return cNoteDate; 
    } 

    public int getcNote() { 
     return cNote; 
    } 

    public double getSurcharge() { 
     return surcharge; 
    } 

    public static void main(String[] args) { 
     List<ModelSurcharge> surcharges= new ArrayList<>(); 
     List<ModelSurcharge> output = surcharges.stream() 
               .collect(groupingBy(p -> p.getcNoteDate(), 
                    Collectors.summingDouble(p -> p.getSurcharge()))); 
    } 
} 

오류 메시지가 잘못된 것입니다. 그러나 이것은 컴파일러가 p의 형식을 컨텍스트에서 유추하려고 시도했기 때문에 발생하지만 groupingBy은 오른쪽 사이드 식을 List<ModelSurcharge>에 할당하려고하기 때문에 사용할 수 없습니다. 명부. 출력 변수 (Map<LocalDate, Double>)에 올바른 유형을 사용하면 오류가 사라집니다.

+0

감사합니다. 나는 Map의 사용법을 놓쳤다. 그러나 Map 을 사용하면 Note No.를 얻을 수 없습니다. Map 함수를 사용하여 3 열 모두의 데이터를 가져와야합니다. LocalDate & Integer를 그룹화해야하며,이를 달성하는 방법을 모르는 것이 좋습니다. – iCoder

+0

내가 한 것처럼 코드를 최소화하고 다른 질문을 작성하고 실제로 출력물로 얻고 싶은 것을 설명하십시오. –

+0

괜찮아. Map 을 사용했습니다.도와 주셔서 다시 한번 감사드립니다. – iCoder