2016-11-15 17 views
0

Excelのアカウント番号を検索しようとしていますが、シートにアカウント番号が含まれていると「総額」が返されます。このコードを使用してスキャンすることはできますが、シートにアカウント番号がない場合はエラーが発生します。Javaでarraylistに空白またはヌルを追加する

for(int i = 0; i < accno.size(); i++){ 
    for(int j = rowAccNo1+1; j < row.getRowNum(); j++){ 
      srcaccno = formatter.formatCellValue(sheet.getRow(j).getCell(0)); 
      totalamt = formatter.formatCellValue(sheet.getRow(j).getCell(10)); 

      if(accno.get(i).contains(srcaccno)){ 
        totalamountdue.add(i, totalamt); 
      } 
     } 
    } 

編集: こんにちは、私は、Apache POIを使用しています。

私は以下のようにaccnoを宣言:

static ArrayList<String> accno = new ArrayList<String>(); 

と、私はこのエラーを取得しています。おそらくJavaはアカウント番号を見つけることができないので、彼はこれをスローします。しかし私は私のarraylistに空またはヌルを追加できるかどうかわかりません。 com.joven.DataExtractionTool.App.compareMastertoSourceABC(App.java:372)で java.util.ArrayList.addでjava.util.ArrayList.rangeCheckForAdd(不明なソース)(不明なソース)で

com.joven.DataExtractionTool.App.main(App.java:78)、 com.joven.DataExtractionTool.AppTest.testApp(AppTest.java:17) sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) sun.reflect.NativeMethodAccessorImpl.invoke(不明なソース) sun.reflect.DelegatingMethodAccessorImpl.invoke(不明なソース) でjava.lang.reflect.Method.invoke(不明なソース) junit.framework.TestCase.runTest(TestCase.java:154)at junit.framework.TestCase.runBare(TestCase.java:127)at junit.framework.TestResult $ 1.protect(TestResult.java:106)at junit.framework.TestResult.runProtected(TestResult.java:124)at junit.framework.TestResult.run(TestResult.java:109) junit.framework.TestCase.run(TestCase.java:118)at junit。フレームワーク.TestSuite.runTest(TestSuite.java:208)at junit.framework.TestSuite.run(TestSuite.java:203)at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference。 java:131) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) でorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) で org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)で org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

ありがとうございました!

本当に好きなことは、シートにaccnoがある場合はtotalamountdueを取得することです。それが存在しない場合は、totalamountdueに空白を入れて、コンソールにarraylistを出力すると空白を表示します。

+1

あなたも私たちはあなたが(私は、Apacheを推測している)を使用しているExcelのJavaライブラリ知っている場合、それは役立つだろう。 –

+0

*条件付き操作*についてはどうですか? –

+0

'accno'の型は何ですか、' null'を含むことができますか?これは正しいとは思われません。(accno.get(i).contains(srcaccno)){' – AxelH

答えて

1

あなたの問題は、リスト内の特定のインデックス(アカウントリストに対応するもの)にtotalを追加するので、あなたは「デフォルト」値を挿入する必要があり、この

if(accno.get(i).contains(srcaccno)){ 
    totalamountdue.add(i, totalamt); // ######## 
} 

から来ますシート内のアカウントを見つけられない場合は、そうしないと、アカウントリストと合計リストの長さが変わります。あなたがfar(範囲外の例外)に値を追加しようとしていることを意味します。

あなたも

totalamountdue.add(null); 

null値を挿入し、シート状に検索を開始する前に実際には、もっと簡単な方法(私が最初に考えていなかった理由を知りません)

があります次に、検索ループで値が見つかった場合は、このnullを置き換えます。

if(accno.get(i).contains(srcaccno)){ 
    totalamountdue.set(i, totalamt); // use SET to replace the value at a specific index. 
} 

フルループ

totalamoutdue.add(null); //will insert at the end, i. 
for(int j = rowAccNo1+1; j < row.getRowNum(); j++){ 
     srcaccno = formatter.formatCellValue(sheet.getRow(j).getCell(0)); 
     if(accno.get(i).contains(srcaccno)){ 
       totalamt = formatter.formatCellValue(sheet.getRow(j).getCell(10)); //No need to get the value if it is not the account you want 
       totalamountdue.set(i, totalamt); 
       break; //Break the current for loop, IF there is no need to read further 
     } 
    } 
+0

あなたは正しいです、問題はその行に来ています。 acc.get(i)がExcelファイルにない場合、ループを停止するためです。 :else {else {totalamountdue.add(i、 "");}のようにelseを追加すると、java.lang.IllegalArgumentExceptionのエラーが発生する – ashlrem

+0

@ashlrem else部分には挿入しないでください。 PS:それはループを停止しません、それはクラッシュ;) – AxelH

+0

他に持っていないあなたのヒントは素晴らしい人です。 .setとbreakについてのあなたの提案に続きました。それは素晴らしい作品です! – ashlrem

0

私はこれらのリストを反復することで何かが間違っていると思うので、コードを簡略化しました。うまくいくと思います。

Map<String, BigDecimal> accountsDue = new HashMap<>(); 

for (int j = rowAccNo1 + 1; j < row.getRowNum(); j++) { 
    String srcaccno = formatter.formatCellValue(sheet.getRow(j).getCell(0)); 
    BigDecimal amountDue = formatter.formatCellValue(sheet.getRow(j).getCell(10)); 
    if (accno.contains(srcaccno)) { 
    putOrIncreaseDue(srcaccno, amountDue, accountsDue); 
    } 
} 

private void putOrIncreaseDue(String srcaccno, BigDecimal amountDue, Map<String, BigDecimal> accountsDue) { 
    if (accountsDue.containsKey(srcaccno)) { 
    amountDue.add(accountsDue.get(srcaccno)); 
    } 
    accountsDue.put(srcaccno, amountDue); 
} 
+0

こんにちは、これはどういう意味ですか? 'amountDue = amountDue.add(accountsDue.get(srcaccno)); } ' – ashlrem

+0

' putOrIncreaseDue'メソッドが何をしているのかを親切に説明できますか?ありがとう! – ashlrem

+0

私はマップとしてアカウント番号をキーとして、AmountDueを値として作成しました。 – krmaj

関連する問題