/** * */ package logbook.gui.logic; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import logbook.data.context.GlobalContext; import logbook.dto.ShipDto; /** * @author Nekopanda * */ public class ShipOrder { public ShipDto ship; /** Lv順, 艦種順, NEW順, 修理順 (ゼロ始まり) */ public int[] sortNumber = new int[4]; public ShipOrder(ShipDto ship) { this.ship = ship; } private static class ShipComparatorBase implements Comparator<ShipOrder> { @Override public int compare(ShipOrder o1, ShipOrder o2) { int ret = Integer.compare(o1.ship.getSortno(), o2.ship.getSortno()); if (ret == 0) { ret = Integer.compare(o1.ship.getId(), o2.ship.getId()); } return ret; } } private static void genSortNumber(List<ShipOrder> list, int index, Comparator<ShipOrder> comp) { Collections.sort(list, comp); for (int i = 0; i < list.size(); ++i) { list.get(i).sortNumber[index] = i; } } public static List<ShipOrder> getOrderedShipList() { List<ShipOrder> ships = new ArrayList<ShipOrder>(); for (ShipDto ship : GlobalContext.getShipMap().values()) { ships.add(new ShipOrder(ship)); } // Lv順 genSortNumber(ships, 0, new ShipComparatorBase() { @Override public int compare(ShipOrder o1, ShipOrder o2) { int ret = -Integer.compare(o1.ship.getLv(), o2.ship.getLv()); if (ret == 0) { return super.compare(o1, o2); } return ret; } }); // 艦種順 genSortNumber(ships, 1, new Comparator<ShipOrder>() { @Override public int compare(ShipOrder o1, ShipOrder o2) { int ret = -Integer.compare(o1.ship.getShipInfo().getStype(), o2.ship.getShipInfo().getStype()); if (ret == 0) { ret = Integer.compare(o1.ship.getSortno(), o2.ship.getSortno()); /*// Lv順の後に安定ソートするので if (ret == 0) { ret = -Integer.compare(o1.ship.getLv(), o2.ship.getLv()); if (ret == 0) { ret = Integer.compare(o1.ship.getId(), o2.ship.getId()); } } */ } return ret; } }); // NEW genSortNumber(ships, 2, new ShipComparatorBase() { @Override public int compare(ShipOrder o1, ShipOrder o2) { return -Integer.compare(o1.ship.getId(), o2.ship.getId()); } }); // 修理順 genSortNumber(ships, 3, new ShipComparatorBase() { @Override public int compare(ShipOrder o1, ShipOrder o2) { double o1rate = (double) o1.ship.getNowhp() / (double) o1.ship.getMaxhp(); double o2rate = (double) o2.ship.getNowhp() / (double) o2.ship.getMaxhp(); int ret = Double.compare(o1rate, o2rate); if (ret == 0) { return super.compare(o1, o2); } return ret; } }); // 最後にID順にしておく Collections.sort(ships, new Comparator<ShipOrder>() { @Override public int compare(ShipOrder o1, ShipOrder o2) { return Integer.compare(o1.ship.getId(), o2.ship.getId()); } }); return ships; } }