Javaでリストの要素が自動で書き換えられてしまっています。

お客様向けの決済情報を記述するプログラムをJavaで作成しています。
2024年1月から始まる証券コード英文字対応に即したプログラムに更新中です。
解決方法をご教授いただけますでしょうか?

実現したいこと

Listの要素を書き換えられることなく、プログラムを起動させたいです。
Listの要素(String)がなぜか書き換わってしまっています。
※詳細はソースコード紹介で記述

前提

・金融機関(証券)の決済に係る書類を作成するプログラム
・以下ソースコードに到達する際のListの要素に誤りはありませんでした。
・お客様のデータをList<String[]>化して、
合計の約定金額や手数料の総額を求める主に計算するためのクラスになります。
・エラーは発生していません。

発生している問題

左と右が一致するはずですが、Listから出力した時点で
右のデータが書き換えられてしまっています。
左はlistStockMasterのStringから、右はlistDataのStringになります。
※詳細はソースコード紹介で記述

8306 : 8306 8306 : 8306 8306 : 8306 8306 : 7203 8306 : 8306 8306 : 8306 8306 : 8306 8306 : 8306 8306 : 7267 8306 : 8306

該当のソースコード

以下のメソッドにおける引数は以下を参照してください。
listData:       顧客の約定データ(社外秘)をリスト化
listStockMaster:  株式銘柄を集約したデータをリスト化
commissionRateStr:顧客の手数料率・手数料を計算する方法(社外秘)
attachform:    売買の並び方を指定する文字列

Line 41の変数stockNumber(listDataの中から銘柄コードを取得)がすべて「8306」になるはずですが、なぜか余計な文字列に書き換えられてしまっています。

Java

1public static List<String[]> PTSAverage(List<String[]> listData, List<String[]> listStockMaster, String[] commissionRateStr, String attachform) {2 3 List<String[]> listDataBuy = new ArrayList<String[]>();4 List<String[]> listDataSell = new ArrayList<String[]>();5 List<String[]> listDataShort = new ArrayList<String[]>();6 7 int i = 0;8 int j = 0;9 int counter = 0;10 int stockNumberStart = 0;11 int stockNumberLast = 0;12 int stockQuantities = 0;13 int shortQuantities = 0;14 Double stockValues =0.0;15 Double shortValues =0.0;16 Double stockAgreementCost = 0.0;17 String stockNumber = null;18 String stockCodesStr = null;19 String BorS = null;20 String PorN = null;21 String[] arrayAve = new String[30];22 23 try {24 int count_SM = listStockMaster.size();25 int count_LD = listData.size();26 //銘柄コードと要素が一致したらリストに挿入する処理27 for (i = 1; i< count_SM; i++) {28 int counterBuy =0;29 int counterSell=0;30 int counterShort = 0;31 int stockQuantitiesBuy =0;32 int stockQuantitiesSell =0;33 int shortQuantitiesSell =0;34 Double stockAgreementCostBuy =0.0;35 Double stockAgreementCostSell =0.0;36 Double shortAgreementCost = 0.0;37 Double shortAgreementCostSell = 0.0;38 39 stockCodesStr = listStockMaster.get(i)[0].replace(".0","");40 for (j= 0; j< count_LD; j++) {41 stockNumber = listData.get(j)[4];42 43 //「買」取引44 if(stockCodesStr.equals(stockNumber) && listData.get(j)[3].equals("買") ) {45 listData.get(j)[3] = defaultWord[0];46 stockValues = Double.valueOf(listData.get(j)[5]);//株価を追加47 stockQuantities = Integer.valueOf(listData.get(j)[6]);//株数を追加48 stockAgreementCost = stockValues * stockQuantities;//買約定合計49 stockAgreementCostBuy = stockAgreementCostBuy + stockAgreementCost;//買約定金額合計50 stockQuantitiesBuy = stockQuantitiesBuy + stockQuantities;//買約定株数合計51 counterBuy++;52 53 //「売」取引54 }else if(stockCodesStr.equals(stockNumber) && listData.get(j)[3].equals("売") ) {55 //空売り判定56 if(listData.get(j)[15].equals("空売")) {57 listData.get(j)[3] = defaultWord[2];58 shortValues = Double.valueOf(listData.get(j)[5]);//株価を追加59 shortQuantities = Integer.valueOf(listData.get(j)[6]);//株数を追加60 shortAgreementCost = shortValues * shortQuantities;//買約定合計61 shortAgreementCostSell = shortAgreementCostSell + shortAgreementCost;//売約定合計62 shortQuantitiesSell = shortQuantitiesSell + shortQuantities;//売約定株数合計63 64 counterShort++;65 66 //通常売り判定 67 }else {68 listData.get(j)[3] = defaultWord[1];69 stockValues = Double.valueOf(listData.get(j)[5]);//株価を追加70 stockQuantities = Integer.valueOf(listData.get(j)[6]);//株数を追加71 stockAgreementCost = stockValues * stockQuantities;//買約定合計72 stockAgreementCostSell = stockAgreementCostSell + stockAgreementCost;//売約定合計73 stockQuantitiesSell = stockQuantitiesSell + stockQuantities;//売約定株数合計74 counterSell++;75 }76 }else if(!(stockCodesStr.equals(stockNumber))) {77 stockNumber = "";78 continue;79 }80 stockNumber = "";81 }82 j = 0;83 counter = counterBuy+counterSell+counterShort;84 //売買のない銘柄は飛ばす85 if(counter ==0) {86 continue;87 //売買のある銘柄はリストに入れる88 }else{89 //株式銘柄MASTERのデータをまとめる90 String[] stockData = null;91 stockData = listStockMaster.get(i);92 93 //買銘柄94 if(counterBuy!=0) {95 BorS = defaultWord[0];96 //if(listData.get(j)[15].equals("新規")) {97 PorN = defaultWord[3];98 //}99 arrayAve = putList(counterBuy,stockQuantitiesBuy, stockAgreementCostBuy, listData,stockCodesStr,BorS,PorN, commissionRateStr, stockData); //買の分をリストに代入100 if (attachform.contains("B")) {101 listDataBuy.add(arrayAve);102 }else {103 listAverage.add(arrayAve);104 }105 }106 107 //売銘柄108 if(counterSell!=0) {109 BorS = defaultWord[1];110 PorN = defaultWord[4];111 arrayAve = putList(counterSell,stockQuantitiesSell, stockAgreementCostSell, listData,stockCodesStr, BorS,PorN, commissionRateStr, stockData);//売の分をリストに代入112 if (attachform.contains("S")) {113 listDataSell.add(arrayAve);114 }else {115 listAverage.add(arrayAve);116 }117 }118 119 //空売銘柄120 if(counterShort!=0) {121 BorS = defaultWord[2];122 PorN = defaultWord[3];123 arrayAve = putList(counterShort,shortQuantitiesSell, shortAgreementCostSell, listData,stockCodesStr, BorS,PorN, commissionRateStr,stockData);//空売の分をリストに代入124 if (attachform.contains("SS")) {125 listDataShort.add(arrayAve);126 }else if(attachform.contains("S")){127 listDataSell.add(arrayAve);128 }else {129 listAverage.add(arrayAve);130 }131 }132 }133 }134 //コンファメーション作成のスタイル135 switch (attachform) {136 case "SSB":137 listAverage.addAll(listDataSell);138 listAverage.addAll(listDataShort);139 listAverage.addAll(listDataBuy);140 break;141 case "SB":142 listAverage.addAll(listDataSell);143 listAverage.addAll(listDataBuy);144 break;145 case "BS":146 listAverage.addAll(listDataBuy);147 listAverage.addAll(listDataSell);148 break;149 }150 }catch(IndexOutOfBoundsException e) {151 //このエラーが出力される時は、約定がないとき 152 }catch (Exception e) {153 JOptionPane.showMessageDialog(null, "Culc_PTSAverage:処理が失敗しました。" + e);154 e.printStackTrace();155 }156 return listAverage;

試したこと

listDataを変えて(別顧客の約定データ)を用いたときにも、
同様の事象が発生しています。

Line41の直前でsystem.out.printlnを実行すると、
約定データは書き換えられていませんでした。

補足情報(FW/ツールのバージョンなど)

Windows 11 Pro
java version 18.0.2

コメントを投稿

0 コメント