我试图在销售商品后使用二维数组作为销售数据来计算库存,但只计算了我的第二个产品id的库存?我使用一个二维数组作为库存,使用第二个二维数组作为销售数据,这是按顺序读取的。第一个数组的产品ids在第一列,起始库存在第二列。
已打印库存数组:
10001 | 3
10002 | 33
10003 | 51
10004 | 101
10005 | 4
10006 | 30
10007 | 36
10008 | 8
10009 | 22
10010 | 74
20001 | 24
20002 | 13
20003 | 0
20004 | 62
20005 | 21
20006 | 22
30001 | 59
30002 | 7
30003 | 18
30004 | 44
30005 | 28
30006 | 106
30007 | 23
30008 | 8
30009 | 29
30010 | 7
30011 | 20
30012 | 24
30013 | 55
30014 | 15
30015 | 64
30016 | 15
30017 | 13
30018 | 34
30019 | 44
30020 | 39打印的销售数据数组:
10002 || 4
10004 || 6
10008 || 2
10010 || 3
10010 || 3
10007 || 10
20003 || 4
20003 || 7
30019 || 1
30020 || 9
10004 || 9
10006 || 7
20005 || 5
30004 || 10
20004 || 2
30002 || 7
30013 || 6
20005 || 5
30006 || 1
30006 || 7
30007 || 2
30012 || 10
30015 || 7
30015 || 3
10001 || 5
20001 || 8
30007 || 3
30014 || 3
30015 || 6
30016 || 2
10001 || 8
10003 || 8
10007 || 5
10007 || 8
20005 || 6
20006 || 10
30003 || 4
30011 || 7
30014 || 7
30016 || 5
20003 || 1
30003 || 4
30010 || 5
30011 || 8
30012 || 1
30014 || 9
30016 || 4
30018 || 5
10006 || 1
10010 || 9
20005 || 5
30001 || 1
30004 || 9
30007 || 5
30009 || 1
30014 || 6
30016 || 5
30016 || 2
30020 || 8
10004 || 3
10004 || 7
10008 || 2
20001 || 4
20003 || 7
20004 || 6
20006 || 2
30001 || 1
30003 || 7
30004 || 1
30004 || 10
30005 || 2
30006 || 7
30017 || 10
30018 || 2
30004 || 6
10009 || 9
10009 || 7
10010 || 10
20005 || 3
30002 || 1
30004 || 2
30004 || 8
30013 || 3
30019 || 3
10004 || 10
10007 || 5
30001 || 7
30003 || 6
30006 || 2
30006 || 3
30007 || 2
30013 || 8
30016 || 8
10003 || 6
10004 || 9
10004 || 2
10006 || 8
10010 || 1
20003 || 9
20003 || 10
30001 || 8
30002 || 1
30013 || 5
30015 || 7
30018 || 1
30019 || 10
30020 || 9
10008 || 1
10009 || 3
20004 || 10
30010 || 7
30012 || 9
30014 || 7
30017 || 4
20004 || 5
30005 || 8
30010 || 7
30011 || 1
10004 || 9
10004 || 4
10006 || 5
10010 || 7
20001 || 3
20003 || 2
20004 || 7
30004 || 8
30010 || 2
30012 || 5
30019 || 8
30020 || 1
10008 || 7
30001 || 9
30003 || 10
30003 || 8
30006 || 5
30008 || 10
30009 || 7
30009 || 8
30015 || 9
30017 || 9
30018 || 7
30020 || 1
10001 || 7
10002 || 10
10003 || 3
10005 || 4
10010 || 4
20001 || 4
20002 || 1
20005 || 5
30006 || 9
30006 || 6
10003 || 7
10003 || 4
10004 || 6
10009 || 6
20002 || 6
20004 || 3
20005 || 3
30001 || 9
30005 || 2
30006 || 10
30008 || 6
30009 || 6
30011 || 10
30013 || 8
30013 || 3
30013 || 5
30015 || 1
30019 || 10
10002 || 6
10004 || 7
10006 || 3
10006 || 2
20002 || 6
20004 || 7
20004 || 7
30005 || 4
30006 || 8
30007 || 3
30008 || 6
30009 || 8
30014 || 5
30015 || 10
30015 || 9
30018 || 3
30019 || 2
30019 || 9
30020 || 1
10006 || 10
20003 || 2
30001 || 3
30005 || 5
30012 || 5
30015 || 5
30015 || 3
30016 || 2
30019 || 8
30019 || 5我尝试按顺序读取销售数据数组和库存数组,只要库存充足,就从库存中减去单位,但我的输出显示只有第二个产品id的库存正在计算?我不知道为什么它只适用于第二个产品id,所以任何帮助都将非常感谢。
int i = 0;//counter for rows in sales data
int k = 0;//counter for rows in inventory
while(i < sale.length ){//while not end of sale data array
if(inv [k][0] == sale[i][0]{//if the product ids are the same
if(inv[k][1] < sale[i][1]){//if the inventory is less than the units to be sold
i = 0;//go back to beginning of sale data
if(k < inv.length){ //while not end of inventory array
k++;//move to next inventory item
}
}
if((inv[k][1] > sale[i][1]) && (inv[k][1] > 0)){//if there is enough inventory
inv[k][1] = inv[k][1] - sale[i][1];//subtract units from inventory
i++;//move to next sales item
}
}
else{
i++;//move to next sales item
}
}我的输出:
10001 | 3
10002 | 13
10003 | 51
10004 | 101
10005 | 4
10006 | 30
10007 | 36
10008 | 8
10009 | 22
10010 | 74
20001 | 24
20002 | 13
20003 | 0
20004 | 62
20005 | 21
20006 | 22
30001 | 59
30002 | 7
30003 | 18
30004 | 44
30005 | 28
30006 | 106
30007 | 23
30008 | 8
30009 | 29
30010 | 7
30011 | 20
30012 | 24
30013 | 55
30014 | 15
30015 | 64
30016 | 15
30017 | 13
30018 | 34
30019 | 44
30020 | 39发布于 2016-03-12 02:01:15
你的逻辑是错误的。
只有当你没有足够的库存时,你才会转移到不同的库存项目。
但是,当你完成了特定产品的所有销售项目后,可能还会有一些库存。如果你售出的产品比库存少,你永远不会达到库存不足的地步。因此,你永远不会得到下一个产品。
在您的特定情况下,项目10001的第一次销售比您拥有的要多。所以它移到了10002项。但10002件商品有33件,但你只卖出了20件。您在没有得到inv[k][1] < sale[i][1]的情况下完成了循环。
我相信你的逻辑应该是不同的。假设您不能使用集合和映射(这将更适合于此),只有这样的数组,那么您应该:
所以你会在一个循环中有一个循环。
发布于 2016-03-12 02:06:11
首先,您可能希望使用HashMap<Integer,Integer>而不是数组来解决此问题。
现在,来回答你的问题:你的循环逻辑有问题。@RealSkeptic指出了他答案中的缺陷。如果您首先按productId对销售数据进行排序,则可以大大简化您的解决方案。您可以使用Comparator (改编自this answer)对二维数组进行排序:
Arrays.sort(sale, new Comparator<Integer[]>() {
@Override
public int compare(final Integer[] entry1, final Integer[] entry2) {
final Integer v1 = entry1[0];
final Integer v2 = entry2[0];
return v1.compareTo(v2);
}
});应该使用相同的方法来确保inv数组也是排序的。排序后,您可以使用以下(简化的)循环处理销售:
int i = 0; //inventory id
for(int k=0; k < sale.length; k++){
if(inv[k][0] == sale[i][0]){ //if product Ids match
if(inv[k][1] >= sale[i][1]){ //if there's enough inventory
inv[k][1] -= sale[i][1]; //subtract units from inventory
}
} else { //no more sales for this productId
i++; //move to next item in the inventory
}
}编辑:根据你下面的评论,你可以按照@RealSkeptic建议的那样做,并使用嵌套循环。但是,我强烈建议您使用HashMap。例如:
final HashMap<Integer,Integer> inv = initInventory();
final int[][] sale = initSalesData();
//process the sales data
for(int i = 0; i < sale.length; i++){ //for each sale
final int saleProductId = sale[i][0]; //get the sale productId
final int saleQty = sale[i][1]; // get the sale quantity
final Integer qty = inv.get(saleProductId); //get the inventory quantity
if(qty != null && qty >= saleQty){ //if productId is valid and inventory has sufficient quantity
inv.put(saleProductId, qty-saleQty); //update inventory quantity
}
}您可以使用以下代码测试此方法。输入基于您提供的输入:
import java.util.HashMap;
public class InventoryExample {
public static void main(String[] args) {
final HashMap<Integer,Integer> inv = initInventory();
final int[][] sale = initSalesData();
//process the sales data
for(int i = 0; i < sale.length; i++){ //for each sale
final int saleProductId = sale[i][0]; //get the sale productId
final int saleQty = sale[i][1]; // get the sale quantity
final Integer qty = inv.get(saleProductId); //get the inventory quantity
if(qty != null && qty >= saleQty){ //if productId is valid and inventory has sufficient quantity
inv.put(saleProductId, qty-saleQty); //update inventory quantity
}
}
//print results
for(int productId:inv.keySet()){
System.out.println(productId+" | "+inv.get(productId));
}
}
private static HashMap<Integer, Integer> initInventory() {
final HashMap<Integer, Integer> inv = new HashMap<>();
inv.put(10001, 3);
inv.put(10002, 33);
inv.put(10003, 51);
inv.put(10004, 101);
inv.put(10005, 4);
inv.put(10006, 30);
inv.put(10007, 36);
inv.put(10008, 8);
inv.put(10009, 22);
inv.put(10010, 74);
inv.put(20001, 24);
inv.put(20002, 13);
inv.put(20003, 0);
inv.put(20004, 62);
inv.put(20005, 21);
inv.put(20006, 22);
inv.put(30001, 59);
inv.put(30002, 7);
inv.put(30003, 18);
inv.put(30004, 44);
inv.put(30005, 28);
inv.put(30006, 106);
inv.put(30007, 23);
inv.put(30008, 8);
inv.put(30009, 29);
inv.put(30010, 7);
inv.put(30011, 20);
inv.put(30012, 24);
inv.put(30013, 55);
inv.put(30014, 15);
inv.put(30015, 64);
inv.put(30016, 15);
inv.put(30017, 13);
inv.put(30018, 34);
inv.put(30019, 44);
inv.put(30020, 39);
return inv;
}
private static int[][] initSalesData() {
return new int[][] {
{10002, 4},
{10004, 6},
{10008, 2},
{10010, 3},
{10010, 3},
{10007, 10},
{20003, 4},
{20003, 7},
{30019, 1},
{30020, 9},
{10004, 9},
{10006, 7},
{20005, 5},
{30004, 10},
{20004, 2},
{30002, 7},
{30013, 6},
{20005, 5},
{30006, 1},
{30006, 7},
{30007, 2},
{30012, 10},
{30015, 7},
{30015, 3},
{10001, 5},
{20001, 8},
{30007, 3},
{30014, 3},
{30015, 6},
{30016, 2},
{10001, 8},
{10003, 8},
{10007, 5},
{10007, 8},
{20005, 6},
{20006, 10},
{30003, 4},
{30011, 7},
{30014, 7},
{30016, 5},
{20003, 1},
{30003, 4},
{30010, 5},
{30011, 8},
{30012, 1},
{30014, 9},
{30016, 4},
{30018, 5},
{10006, 1},
{10010, 9},
{20005, 5},
{30001, 1},
{30004, 9},
{30007, 5},
{30009, 1},
{30014, 6},
{30016, 5},
{30016, 2},
{30020, 8},
{10004, 3},
{10004, 7},
{10008, 2},
{20001, 4},
{20003, 7},
{20004, 6},
{20006, 2},
{30001, 1},
{30003, 7},
{30004, 1},
{30004, 10},
{30005, 2},
{30006, 7},
{30017, 10},
{30018, 2},
{30004, 6},
{10009, 9},
{10009, 7},
{10010, 10},
{20005, 3},
{30002, 1},
{30004, 2},
{30004, 8},
{30013, 3},
{30019, 3},
{10004, 10},
{10007, 5},
{30001, 7},
{30003, 6},
{30006, 2},
{30006, 3},
{30007, 2},
{30013, 8},
{30016, 8},
{10003, 6},
{10004, 9},
{10004, 2},
{10006, 8},
{10010, 1},
{20003, 9},
{20003, 10},
{30001, 8},
{30002, 1},
{30013, 5},
{30015, 7},
{30018, 1},
{30019, 10},
{30020, 9},
{10008, 1},
{10009, 3},
{20004, 10},
{30010, 7},
{30012, 9},
{30014, 7},
{30017, 4},
{20004, 5},
{30005, 8},
{30010, 7},
{30011, 1},
{10004, 9},
{10004, 4},
{10006, 5},
{10010, 7},
{20001, 3},
{20003, 2},
{20004, 7},
{30004, 8},
{30010, 2},
{30012, 5},
{30019, 8},
{30020, 1},
{10008, 7},
{30001, 9},
{30003, 10},
{30003, 8},
{30006, 5},
{30008, 10},
{30009, 7},
{30009, 8},
{30015, 9},
{30017, 9},
{30018, 7},
{30020, 1},
{10001, 7},
{10002, 10},
{10003, 3},
{10005, 4},
{10010, 4},
{20001, 4},
{20002, 1},
{20005, 5},
{30006, 9},
{30006, 6},
{10003, 7},
{10003, 4},
{10004, 6},
{10009, 6},
{20002, 6},
{20004, 3},
{20005, 3},
{30001, 9},
{30005, 2},
{30006, 10},
{30008, 6},
{30009, 6},
{30011, 10},
{30013, 8},
{30013, 3},
{30013, 5},
{30015, 1},
{30019, 10},
{10002, 6},
{10004, 7},
{10006, 3},
{10006, 2},
{20002, 6},
{20004, 7},
{20004, 7},
{30005, 4},
{30006, 8},
{30007, 3},
{30008, 6},
{30009, 8},
{30014, 5},
{30015, 10},
{30015, 9},
{30018, 3},
{30019, 2},
{30019, 9},
{30020, 1},
{10006, 10},
{20003, 2},
{30001, 3},
{30005, 5},
{30012, 5},
{30015, 5},
{30015, 3},
{30016, 2},
{30019, 8},
{30019, 5}
};
}
}这将生成以下输出:
10001 | 3
10002 | 13
10003 | 23
10004 | 29
10005 | 0
10006 | 4
10007 | 8
10008 | 3
10009 | 3
10010 | 37
20001 | 5
20002 | 0
20003 | 0
20004 | 15
20005 | 0
20006 | 10
30001 | 21
30002 | 0
30003 | 3
30004 | 6
30005 | 7
30006 | 48
30007 | 8
30008 | 2
30009 | 7
30010 | 0
30011 | 4
30012 | 4
30013 | 17
30014 | 0
30015 | 4
30016 | 0
30017 | 3
30018 | 16
30019 | 1
30020 | 10https://stackoverflow.com/questions/35946650
复制相似问题