this sorusunun devamı olan bir sayımda sorun yaşıyorum. Ben gerçekten matematik öğrencisi değilim, bu yüzden çözünürlük olarak önerilen bu subset sum problem
anlamaya gerçekten zor. | Ali taraftarı, alTransaction, alNumber, alPriceBu tabloyu kapaBu tabloyu aç Alıntı sayısı
Tür:
Hangi ı verileri tutan 4
ArrayList
yaşıyorum İşlem | Sayı | Fiyat
8 | Satın al | 95.00000000 | 305.00000000
8 | Satın al | 126.00000000 | 305.00000000
8 | Satın al | 93.00000000 | 306.00000000
8 | Aktar 221.00000000 | 305.00000000
8 | Transfer | 221.00000000 | 305.00000000
8 | Sat | 93.00000000 | 360.00000000
8 | Sat | 95.00000000 | 360.00000000
8 | Sat | 126.00000000 | 360.00000000
8 | Satın al | 276.00000000 | Ben müşteri için kalan ve ne 3 dizi listeleri koymak kalanları almaya çalışıyorum Sonunda
380,00000000
:- alNewHowMuch (alNumber denk gelmektedir)
- alNewPrice (alPrice denk gelmektedir)
- alNewInID (Ali taraftarı için corrseponds)
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;
}
}
Temelde ben ekleme ve İşlem Türü, İşlem kimliği ve Sayılar bağlı Array şeyleri çıkarmadan ediyorum. ArrayList'e 156, 340 (TransferIn veya Buyulduğunda) vb. Gibi sayıları ekliyorum ve sonra bunları 156, 340 (TransferOut, Sat) olduğunda yapıyorlar. Benim çözümüm, problemsiz bir şekilde çalışıyor. Sahip olduğum problem, bazı eski veri çalışanlarının toplamı 500 + 400 + 100 + 500 yerine 1500 gibi giriyor olmasıdır. Sell/TransferOut
veya Buy/Transfer In
olduğunda ve ArrayList içinde eşleşme olmadığında, bu ArrayList
'dan birden çok öğe eklemeyi denemeli ve birleştirilecek öğeleri bir araya getirecek şekilde nasıl değiştirirdim?
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);
}
}
}
var Ama sadece belli şartlar yerine getirildiği takdirde çalışır ve geri kalanı için başarısız olduğunda basit toplayarak her şey bu sorunu çözmek için çalıştı.
Düzeltme: Bazılarınız benim saygısız değişken isimlerimden öylesine şaşkın (ve kör olmuş) olduklarından, hepsini basitlik ve görünürlük için ingilizceye çevirdim. Umarım bu bana yardım etmeme yardımcı olur :-)
Belirleyicilerin seçiminiz inanılmaz ... – Joren
Anahtarın yanlış kullanımı, iki tane yeterli olurdu .. –
@Joren: Lehçe daha mantıklı olabilir. –