我没有实现`Collections.rotate`吧?

时间:2015-08-31 07:16:18

标签: java collections

假设我有一个名为FixedPlan的{​​{1}}类型的对象。

fixedPlan对象包含:

  • FixedPlan List个名为FixedSubPlan
  • 的对象
  • 名为listOfSubPlans的{​​{1}} HashMap<String, List<Plant>>个密钥(它们是植物系列的名称)和listOfFamiliesString个对象作为值。事实上,我将其设为List

Plant对象包含:

  • LinkedHashMap名为FixedSubPlan的植物科。这些代表List<String>中每个家庭的顺序。

orderOfFamilies对象包含:

  • 与植物特征有关的若干属性

当我向FixedSubPlan添加名为Plant的{​​{1}}时,我必须检查Plant的家庭是否存在,如果存在,只需将其添加到我的newPlant在现有密钥或家庭下,例如:FixedPlan。如果没有,我必须在我的newPlant中添加一个新密钥或系列,并将LinkedHashMap添加到临时列表中,以便我可以将其插入fixedPlan.get("OldFamily").add(newPlant);中,如下所示: HashMap newPlantHashMap个项目的数量应该等于listOfFamilies.put("NewFamily", tempList);中的键数。因此,对于添加的每个家庭,都有一个新的FixedSubPlan对象。更重要的是,我必须以这样的方式安排每个listOfSubPlans对象listOfFamilies,如果我有3个家庭:

  • FixedSubPlan 1:A家庭,B家庭,C家庭
  • FixedSubPlan 2:B家庭,C家庭,A家庭
  • FixedSubPlan 3:家庭C,家庭A,家庭B

如果我删除了一个系列,我还必须删除列表中的最后一个FixedSubPlan,例如,如上所示,如果我删除 Family B ,我的{{1应该如下:

  • FixedSubPlan 1:A家庭,C家庭
  • FixedSubPlan 2:家庭C,家庭A

我已经有以下代码:

对于FixedPlan:

FixedSubPlan

orderOfFamilies

FixedSubPlan

我认为我的listOfSubPlans功能效果很好。我猜。但是我的public class FixedPlan { String name; // Name of plan HashMap<String, List<Plant>> listOfFamilies; // HashMap containing Plant Family Names as keys and a List of plants List<FixedSubPlan> listOfSubPlans; public FixedPlan() { name = null; listOfFamilies = new LinkedHashMap<>(); listOfSubPlans = new ArrayList<>(); } public FixedPlan(String name, HashMap<String, List<Plant>> listOfFamilies, List<FixedSubPlan> listOfSubPlans) { this.name = name; this.listOfFamilies = (LinkedHashMap) listOfFamilies; this.listOfSubPlans = listOfSubPlans; } public List<String> getFamilyNames() { List<String> listOfFamilies = new ArrayList<>(); for (String key : this.listOfFamilies.keySet()) { listOfFamilies.add(key); } return listOfFamilies; } public int getNumberOfSubPlans() { return listOfSubPlans.size(); } public void addPlant(Plant newPlant) { String family = newPlant.getFamilyName(); if (listOfFamilies.containsKey(family)) { listOfFamilies.get(family).add(newPlant); } else { List<Plant> tempList = new ArrayList<>(); tempList.add(newPlant); addFamily(family, tempList); } } public void addFamily(String newFamily, List<Plant> newPlants) { if (getNumberOfFamilies() == 0) { listOfFamilies.put(newFamily, newPlants); listOfSubPlans.add(new FixedSubPlan(getNumberOfSubPlans(), getFamilyNames())); return; } String lastFamily = getFamilyNames().get(getNumberOfFamilies() - 1); listOfFamilies.put(newFamily, newPlants); for (int i = 0; i < getNumberOfSubPlans(); i++) { listOfSubPlans.get(i).addFamily(lastFamily, newFamily); } FixedSubPlan newSubPlan = new FixedSubPlan(getNumberOfSubPlans(), getFamilyNames()); newSubPlan.rotateFamily(getNumberOfSubPlans()); listOfSubPlans.add(newSubPlan); } public void removePlant(Plant plant) { if (isPlantPresent(plant)) { String familyOfPlant = plant.getFamilyName(); // remove plant from the ArrayList listOfFamilies.get(familyOfPlant).remove(plant); // if the number of plants under the key "familyOfPlant" equals to 0; there's no use keeping it; // thus, delete if (listOfFamilies.get(familyOfPlant).size() == 0) removeFamily(familyOfPlant); } } public void removeFamily(String family) { if (isFamilyPresent(family)) { listOfFamilies.remove(family); for (int i = 0; i < getNumberOfSubPlans(); i++) { listOfSubPlans.get(i).removeFamily(family); } listOfSubPlans.remove(getNumberOfSubPlans() - 1); } } 方法遇到了麻烦。例如,我添加了来自4个不同家庭的4个FixedSubPlan个对象;我会得到:

  • SubPlan 1:A家庭,B家庭,C家庭
  • SubPlan 2:B家庭,C家庭,A家庭
  • SubPlan 3:B家庭,C家庭,A家庭
  • SubPlan 4:B家庭,C家庭,A家庭

只有前两个public class FixedSubPlan implements Parcelable { int year; List<String> orderOfFamilies; public FixedSubPlan(int year, List<String> orderOfFamilies) { this.year = year; this.orderOfFamilies = orderOfFamilies; } public List<String> getOrderOfFamilies() { return orderOfFamilies; } public void addFamily(String lastFamily, String newFamily) { int indexOfLastFamily = orderOfFamilies.indexOf(lastFamily); orderOfFamilies.add(indexOfLastFamily + 1, newFamily); } public void removeFamily(String family) { orderOfFamilies.remove(family); } public void rotateFamily(int distance) { Collections.rotate(orderOfFamilies, distance); } 是正确的。 :/实际上,没有。我希望这些项目能够降低索引。但我得到了这个。他们正在上升指数。

因此,总而言之,我假设在这段代码中出现问题:

remove

它在方法addFamily()中。另外,我没有发布我的整个代码。这太冗长了。如果需要,我可以把它放在这里。感谢。

1 个答案:

答案 0 :(得分:0)

经过多次回溯,我终于解决了我的问题。我需要用这个替换我的代码:

FixedSubPlan newSubPlan = new FixedSubPlan(getNumberOfSubPlans(), getFamilyNames());
newSubPlan.rotateFamily(getNumberOfSubPlans() * -1);
listOfSubPlans.add(newSubPlan);

解释起来有点棘手。但是我插入新家庭的方式(如下所示)就是原因。

for (int i = 0; i < getNumberOfSubPlans(); i++) {
    listOfSubPlans.get(i).addFamily(lastFamily, newFamily);
}