X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=jarrg-ian.git;a=blobdiff_plain;f=src%2Fcom%2Ftedpearson%2Fypp%2Fmarket%2FMarketUploader.java;h=9aa8f046301e1480e90aaf7ef2c56f61f4958aa5;hp=729c6869f4ffc2b658501115222b4a775faaa1ee;hb=27386c58e010ef63c7eb48172cc9f908225d24a9;hpb=78039ce424d4c4b5b9011b99e993ac7bd80a3a9c diff --git a/src/com/tedpearson/ypp/market/MarketUploader.java b/src/com/tedpearson/ypp/market/MarketUploader.java index 729c686..9aa8f04 100644 --- a/src/com/tedpearson/ypp/market/MarketUploader.java +++ b/src/com/tedpearson/ypp/market/MarketUploader.java @@ -78,6 +78,14 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis } } }; + + private int parseQty(String str) { + if (str.equals(">1000")) { + return 1001; + } else { + return Integer.parseInt(str); + } + } /** * An abstract market offer, entailing a commodity being bought or sold by @@ -108,11 +116,7 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis commodity = commodId.intValue(); price = Integer.parseInt(record.get(priceIndex)); String qty = record.get(priceIndex+1); - if(qty.equals(">1000")) { - quantity = 1001; - } else { - quantity = Integer.parseInt(record.get(priceIndex+1)); - } + quantity = parseQty(qty); shoppe = stallMap.get(record.get(1)).intValue(); } @@ -423,6 +427,10 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis ArrayList> data = getData(accesstable); + if (false) { + calculateArbitrage(data); + } + if (uploadToYarrg && yarrgts != null) { pm.setNote("Yarrg: Preparing data"); pm.setProgress(10); @@ -975,5 +983,71 @@ public class MarketUploader implements TopLevelWindowListener, GUIInitializedLis } return true; } + + private int calculateArbitrageCommodity(ArrayList> arb_bs) { + System.out.println("ARBITRAGE?"); + int profit = 0; + SortedSet buys = arb_bs.get(0); + SortedSet sells = arb_bs.get(1); + while (true) { + int[] buy, sell; + try { + buy = buys.first(); + sell = sells.last(); + } catch (NoSuchElementException e) { + break; + } + int count = buy[1] < sell[1] ? buy[1] : sell[1]; + System.out.println(" buy @"+buy[0]+" x"+buy[1]+" sell @"+sell[0]+" x"+sell[1]+" => x"+count); + profit += count * (buy[0] - sell[0]); + buy[1] -= count; + sell[1] -= count; + if (buy[1]==0) buys.remove(buy); + if (sell[1]==0) buys.remove(sell); + } + return profit; + } + + private class arbitrageOfferComparator implements Comparator { + public int compare(Object o1, Object o2) { + int p1 = ((int[])o1)[0]; + int p2 = ((int[])o2)[0]; + return p2 - p1; + } + } + + private @SuppressWarnings("unchecked") void calculateArbitrage(ArrayList> data) + { + int arbitrage = 0; + ArrayList> arb_bs = null; + String lastcommod = null; + Comparator compar = new arbitrageOfferComparator(); + + for (ArrayList row : data) { + String thiscommod = row.get(0); + System.out.println("ROW "+row.toString()); + if (lastcommod == null || !thiscommod.equals(lastcommod)) { + if (lastcommod != null) + arbitrage += calculateArbitrageCommodity(arb_bs); + //System.out.println("ROW rdy"); + arb_bs = new ArrayList>(2); + arb_bs.add(0, new TreeSet(compar)); + arb_bs.add(1, new TreeSet(compar)); + System.out.println("ROW init"); + lastcommod = thiscommod; + } + for (int bs = 0; bs < 2; bs++) { + String pricestr = row.get(bs*2 + 2); + if (pricestr == null) + continue; + int[] entry = new int[2]; + //System.out.println("ROW BS "+bs); + entry[0] = parseQty(pricestr); + entry[1] = parseQty(row.get(bs*2 + 3)); + arb_bs.get(bs).add(entry); + } + } + arbitrage += calculateArbitrageCommodity(arb_bs); + } }