2017-06-01 10 views
1

同じドメインオブジェクトの2つのArrayListを結合して合計したい(特定のプロパティ)。複数のプロパティマッチングの条件に基づいて、それらを1つに結合します。ここでオブジェクトのArrayListとJavaのBigDecimalの合計を結合します

は私のモデルクラスは、一例として、以下のものを使用して

public class SalesTransactionTax { 

    private String code; 
    private BigDecimal rate; 
    private Boolean isFixed; 
    private BigDecimal taxAmount; 

    public SalesTransactionTax(String code, BigDecimal rate, Boolean isFixed, BigDecimal taxAmount) { // NO_UCD 
                            // (unused 
    // code) 

    this.code = code; 
    this.rate = rate; 
    this.isFixed = isFixed; 
    this.taxAmount = taxAmount; 
    } 

    public SalesTransactionTax() { 

    } 

    public String getCode() { 

    return code; 
    } 

    public void setCode(String code) { 

    this.code = code; 
    } 

    public BigDecimal getRate() { 

    return rate; 
    } 

    public void setRate(BigDecimal rate) { 

    this.rate = rate; 
    } 

    public Boolean getIsFixed() { 

    return isFixed; 
    } 

    public void setFixed(Boolean fixed) { 

    isFixed = fixed; 
    } 

    public BigDecimal getTaxAmount() { 
    return taxAmount; 
    } 

    public void setTaxAmount(BigDecimal taxAmount) { 
    this.taxAmount = taxAmount; 
    } 

    @Override 
    public String toString() { 
    return "SalesTransactionTax [code=" + code + ", rate=" + rate + ", isFixed=" + isFixed 
     + ", taxAmount=" + taxAmount + "]"; 
    } 

} 

です:新しいArrayListの中

List<SalesTransactionTax> taxes = new ArrayList<>(); 

taxes.add(new SalesTransactionTax("VAT_1", 5.000, true, 1.100)); 
taxes.add(new SalesTransactionTax("VAT_1", 5.000, true, 1.100)); 
taxes.add(new SalesTransactionTax("VAT_2", 9.000, true, 2.200)); 
taxes.add(new SalesTransactionTax("VAT_2", 9.000, true, 2.200)); 
taxes.add(new SalesTransactionTax("VAT_2", 9.000, true, 2.200)); 
taxes.add(new SalesTransactionTax("VAT_2", 9.000, false, 9.500)); 
taxes.add(new SalesTransactionTax("VAT_3", 7.000, true, 1.000)); 

値は次のようになります。

  • 真VAT_1、5.000、 2.200
  • VAT_2,9.00、true、6.600
  • VAT_2、9.000、9.500
  • 真VAT_3、7.000、1.000
  • のJava 8を使用して

は、多分ラムダ式は、移動するための方法だろうか?ご意見ありがとうございます。

+0

'SampleModel'クラスとは何ですか? – Yahya

+0

@Yahyaそれは私の悪い矯正でした。 – SiriusBits

答えて

4

を使用すると、新しいトランザクションが確立検証に準拠しているかどうかを確認する必要があります。

検証がすべきは、同じあります。リストに新しいSalesTransactionTaxを存在する場合

public void add(SalesTransactionTax inputValue) { 
    SalesTransactionTax salesTransactionTax = checkInList(inputValue); 
    if (salesTransactionTax != null) { 
     // To sum operations the method used is add() from BigDecimal 
     salesTransactionTax.setTaxAmount(salesTransactionTax.getTaxAmount().add(inputValue.getTaxAmount())); 
    } else { 
     this.salesTransactionTaxList.add(inputValue); 
    } 
} 

を確認するには、Java 8

から filter()方法を使用して検証することができます: getCode(), getRate(), getIsFixed()

スニペットコードを追加します

検証を確認するスニペットコード:

private SalesTransactionTax checkInList(SalesTransactionTax stt) { 
    return salesTransactionTaxList.stream() 
      // To compare String is used equals() 
      .filter(stt2 -> stt2.getCode().equals(stt.getCode())) 
      // To compare BigDecimal is used compareTo() 
      .filter(stt2 -> stt2.getRate().compareTo(stt.getRate()) == 0) 
      // To compare boolean is used == 
      .filter(stt2 -> stt2.getIsFixed() == stt.getIsFixed()) 
      // If doesn't exist return null 
      .findAny().orElse(null); 
} 

全例:

import java.math.BigDecimal; 
import java.text.DecimalFormat; 
import java.util.ArrayList; 
import java.util.List; 

public class SalesTransactionTax { 

    private String code; 
    private BigDecimal rate; 
    private Boolean isFixed; 
    private BigDecimal taxAmount; 
    private List<SalesTransactionTax> salesTransactionTaxList = null; 

    public SalesTransactionTax(String code, BigDecimal rate, Boolean isFixed, BigDecimal taxAmount) { // NO_UCD 
     this.code = code; 
     this.rate = rate; 
     this.isFixed = isFixed; 
     this.taxAmount = taxAmount; 
    } 

    public SalesTransactionTax() { 
     this.salesTransactionTaxList = new ArrayList<>(); 
    } 

    public String getCode() { 
     return code; 
    } 

    public void setCode(String code) { 
     this.code = code; 
    } 

    public BigDecimal getRate() { 
     return rate; 
    } 

    public void setRate(BigDecimal rate) { 
     this.rate = rate; 
    } 

    public Boolean getIsFixed() { 
     return isFixed; 
    } 

    public void setFixed(Boolean fixed) { 
     isFixed = fixed; 
    } 

    public BigDecimal getTaxAmount() { 
     return taxAmount; 
    } 

    public void setTaxAmount(BigDecimal taxAmount) { 
     this.taxAmount = taxAmount; 
    } 

    public void add(SalesTransactionTax inputValue) { 
     SalesTransactionTax salesTransactionTax = checkInList(inputValue); 
     if (salesTransactionTax != null) { 
      // To sum operations the method used is add() from BigDecimal 
      salesTransactionTax.setTaxAmount(salesTransactionTax.getTaxAmount().add(inputValue.getTaxAmount())); 
     } else { 
      this.salesTransactionTaxList.add(inputValue); 
     } 
    } 

private SalesTransactionTax checkInList(SalesTransactionTax stt) { 
    return salesTransactionTaxList.stream() 
      // To compare String is used equals() 
      .filter(stt2 -> stt2.getCode().equals(stt.getCode())) 
      // To compare BigDecimal is used compareTo() 
      .filter(stt2 -> stt2.getRate().compareTo(stt.getRate()) == 0) 
      // To compare boolean is used == 
      .filter(stt2 -> stt2.getIsFixed() == stt.getIsFixed()) 
      // If doesn't exist return null 
      .findAny().orElse(null); 
} 

    public void print() { 
     salesTransactionTaxList.forEach(System.out::println); 
    } 

    @Override 
    public String toString() { 
     //Output formatted 
     DecimalFormat df = new DecimalFormat("#,###.000"); 
     return code + ", " + df.format(new BigDecimal(String.valueOf(rate))) + ", " + isFixed + ", " + df.format(new BigDecimal(String.valueOf(taxAmount))); 
    } 

    public static void main(String[] args) { 

     SalesTransactionTax mergeTaxes = new SalesTransactionTax(); 
     mergeTaxes.add(new SalesTransactionTax("VAT_1", BigDecimal.valueOf(5.000), true, BigDecimal.valueOf(1.100))); 
     mergeTaxes.add(new SalesTransactionTax("VAT_1", BigDecimal.valueOf(5.000), true, BigDecimal.valueOf(1.100))); 
     mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), true, BigDecimal.valueOf(2.200))); 
     mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), true, BigDecimal.valueOf(2.200))); 
     mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), true, BigDecimal.valueOf(2.200))); 
     mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), false, BigDecimal.valueOf(9.500))); 
     mergeTaxes.add(new SalesTransactionTax("VAT_3", BigDecimal.valueOf(7.000), true, BigDecimal.valueOf(1.000))); 
     mergeTaxes.print(); 
    } 

} 

出力:

VAT_1, 5.000, true, 2.200 
VAT_2, 9.000, true, 6.600 
VAT_2, 9.000, false, 9.500 
VAT_3, 7.000, true, 1.000 
+0

それは良い解決策です! – Yahya

+0

ありがとう@ヤハヤ:) –

+0

優れたソリューション@JUANCALVOPINAM。それはラムダ式を使ってうまくトリックをしました。 – SiriusBits

0

二つの特性が 1でそれらを組み合わせ、その後、一致した場合は、条件に基づいて

を言いました。

しかし、例の結果に基づいて、3つのプロパティの一致を確認する必要があります。

public class SalesTransactionMerge { 

private List<SalesTransactionTax> taxes = null; 

public List<SalesTransactionTax> getTaxes(){ 
    return this.taxes; 
} 

public SalesTransactionMerge(){ 
    this.taxes = new ArrayList<SalesTransactionTax>(); 
} 

public void add(SalesTransactionTax stt){ 
    SalesTransactionTax sttExists = exists(stt); 
    if(sttExists == null){ 
     this.taxes.add(stt); 
    } 
    else{ 
     sttExists.setTaxAmount(sttExists.getTaxAmount().add(stt.getTaxAmount())); 
    } 
} 

private SalesTransactionTax exists(SalesTransactionTax stt){ 
    SalesTransactionTax sttExists = null; 
    for(SalesTransactionTax stt2 : taxes){ 
     int matches = 0; 
     if(stt2.getCode().equals(stt.getCode())) matches++; 
     if(stt2.getRate().compareTo(stt.getRate()) == 0) matches++; 
     if(stt2.getIsFixed() == stt.getIsFixed()) matches++; 
     if(matches == 3){  
      sttExists = stt2; 
      break; 
     } 
    } 
    return sttExists; 
} 

public void print(){ 
    for(SalesTransactionTax stt : taxes){ 
     System.out.println(stt.toString()); 
    } 
} 
} 

それを行うためadd (...)方法は、税の額を合計するためのロジックを持っている必要がありますあなたの例

public static void main(String[] args) { 

    SalesTransactionMerge mergeTaxes = new SalesTransactionMerge(); 
    mergeTaxes.add(new SalesTransactionTax("VAT_1", BigDecimal.valueOf(5.000), true, BigDecimal.valueOf(1.100))); 
    mergeTaxes.add(new SalesTransactionTax("VAT_1", BigDecimal.valueOf(5.000), true, BigDecimal.valueOf(1.100))); 
    mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), true, BigDecimal.valueOf(2.200))); 
    mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), true, BigDecimal.valueOf(2.200))); 
    mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), true, BigDecimal.valueOf(2.200))); 
    mergeTaxes.add(new SalesTransactionTax("VAT_2", BigDecimal.valueOf(9.000), false, BigDecimal.valueOf(9.500))); 
    mergeTaxes.add(new SalesTransactionTax("VAT_3", BigDecimal.valueOf(7.000), true, BigDecimal.valueOf(1.000))); 
    mergeTaxes.print(); 
} 
+0

訂正された文言、返信ありがとうございます。 – SiriusBits

関連する問題