我遇到了一个计数问题,这是 这个 问题的延续。我不是一个数学专业的人,所以很难理解建议解决方案中提到的“子集和问题”。
我有4个ArrayList来保存数据:alId、alTransaction、alNumber、alPrice。
以下是数据表格:
类型 | 交易 | 数量 | 价格 ----|------|------|------ 8 | 购买 | 95.00000000 | 305.00000000 8 | 购买 | 126.00000000 | 305.00000000 8 | 购买 | 93.00000000 | 306.00000000 8 | 转出 | 221.00000000 | 305.00000000 8 | 转入 | 221.00000000 | 305.00000000 8 | 卖出 | 93.00000000 | 360.00000000 8 | 卖出 | 95.00000000 | 360.00000000 8 | 卖出 | 126.00000000 | 360.00000000 8 | 购买 | 276.00000000 | 380.00000000
最终,我想要得到客户剩余的数量,并将其放入3个ArrayList中:
- alNewHowMuch(对应于alNumber) - alNewPrice(对应于alPrice) - alNewInID(对应于alID)
基本上我根据交易类型、交易ID和数字向数组中添加和删除内容。例如,当进行转入或购买时,我会像156、340这样将数字添加到ArrayList中,然后在进行转出或销售时再将它们删除,如156、340等。我的解决方案可以正常运行,但是问题是对于一些旧数据,员工输入的总数是1500而不是500+400+100+500。我该怎么做才能使其在
在我的代码中,当没有匹配项(索引==1)时,我试图通过简单地将所有内容相加来解决这个问题。
我有4个ArrayList来保存数据:alId、alTransaction、alNumber、alPrice。
以下是数据表格:
类型 | 交易 | 数量 | 价格 ----|------|------|------ 8 | 购买 | 95.00000000 | 305.00000000 8 | 购买 | 126.00000000 | 305.00000000 8 | 购买 | 93.00000000 | 306.00000000 8 | 转出 | 221.00000000 | 305.00000000 8 | 转入 | 221.00000000 | 305.00000000 8 | 卖出 | 93.00000000 | 360.00000000 8 | 卖出 | 95.00000000 | 360.00000000 8 | 卖出 | 126.00000000 | 360.00000000 8 | 购买 | 276.00000000 | 380.00000000
最终,我想要得到客户剩余的数量,并将其放入3个ArrayList中:
- alNewHowMuch(对应于alNumber) - alNewPrice(对应于alPrice) - alNewInID(对应于alID)
ArrayList alNewHowMuch = new ArrayList();
ArrayList alNewPrice = new ArrayList();
ArrayList alNewInID = new ArrayList();
for (int i = 0; i < alTransaction.Count; i++) {
string transaction = (string) alTransaction[i];
string id = (string) alID[i];
decimal price = (decimal) alPrice[i];
decimal number = (decimal) alNumber[i];
switch (transaction) {
case "Transfer out":
case "Sell":
int index = alNewHowMuch.IndexOf(number);
if (index != -1) {
alNewHowMuch.RemoveAt(index);
alNewPrice.RemoveAt(index);
alNewInID.RemoveAt(index);
} else {
ArrayList alTemp = new ArrayList();
decimal sum = 0;
for (int j = 0; j < alNewHowMuch.Count; j ++) {
string tempid = (string) alNewInID[j];
decimal tempPrice = (decimal) alNewPrice[j];
decimal tempNumbers = (decimal) alNewHowMuch[j];
if (id == tempid && tempPrice == price) {
alTemp.Add(j);
sum = sum + tempNumbers;
}
}
if (sum == number) {
for (int j = alTemp.Count - 1; j >= 0; j --) {
int tempIndex = (int) alTemp[j];
alNewHowMuch.RemoveAt(tempIndex);
alNewPrice.RemoveAt(tempIndex);
alNewInID.RemoveAt(tempIndex);
}
}
}
break;
case "Transfer In":
case "Buy":
alNewHowMuch.Add(number);
alNewPrice.Add(price);
alNewInID.Add(id);
break;
}
}
基本上我根据交易类型、交易ID和数字向数组中添加和删除内容。例如,当进行转入或购买时,我会像156、340这样将数字添加到ArrayList中,然后在进行转出或销售时再将它们删除,如156、340等。我的解决方案可以正常运行,但是问题是对于一些旧数据,员工输入的总数是1500而不是500+400+100+500。我该怎么做才能使其在
Sell/TransferOut
或Buy/Transfer In
时,在ArrayList中没有匹配项的情况下尝试添加多个项目,并找到组合成聚合的元素。在我的代码中,当没有匹配项(索引==1)时,我试图通过简单地将所有内容相加来解决这个问题。
int index = alNewHowMuch.IndexOf(number);
if (index != -1) {
alNewHowMuch.RemoveAt(index);
alNewPrice.RemoveAt(index);
alNewInID.RemoveAt(index);
} else {
ArrayList alTemp = new ArrayList();
decimal sum = 0;
for (int j = 0; j < alNewHowMuch.Count; j ++) {
string tempid = (string) alNewInID[j];
decimal tempPrice = (decimal) alNewPrice[j];
decimal tempNumbers = (decimal) alNewHowMuch[j];
if (id == tempid && tempPrice == price) {
alTemp.Add(j);
sum = sum + tempNumbers;
}
}
if (sum == number) {
for (int j = alTemp.Count - 1; j >= 0; j --) {
int tempIndex = (int) alTemp[j];
alNewHowMuch.RemoveAt(tempIndex);
alNewPrice.RemoveAt(tempIndex);
alNewInID.RemoveAt(tempIndex);
}
}
}
但它只在满足特定条件时才有效,对于其他情况则失败。
编辑:由于我的波兰变量名称让一些人感到惊讶(和被盲目刺眼),我将它们全部翻译成英文,以便简化和提高可见性。希望这能帮助我得到一些帮助 :-)