假设我有一个名为FixedPlan
的{{1}}类型的对象。
fixedPlan
对象包含:
FixedPlan
List
个名为FixedSubPlan
listOfSubPlans
的{{1}} HashMap<String, List<Plant>>
个密钥(它们是植物系列的名称)和listOfFamilies
个String
个对象作为值。事实上,我将其设为List
。 Plant
对象包含:
LinkedHashMap
名为FixedSubPlan
的植物科。这些代表List<String>
中每个家庭的顺序。 orderOfFamilies
对象包含:
当我向FixedSubPlan
添加名为Plant
的{{1}}时,我必须检查Plant
的家庭是否存在,如果存在,只需将其添加到我的newPlant
在现有密钥或家庭下,例如:FixedPlan
。如果没有,我必须在我的newPlant
中添加一个新密钥或系列,并将LinkedHashMap
添加到临时列表中,以便我可以将其插入fixedPlan.get("OldFamily").add(newPlant);
中,如下所示: HashMap
。 但 newPlant
中HashMap
个项目的数量应该等于listOfFamilies.put("NewFamily", tempList);
中的键数。因此,对于添加的每个家庭,都有一个新的FixedSubPlan
对象。更重要的是,我必须以这样的方式安排每个listOfSubPlans
对象listOfFamilies
,如果我有3个家庭:
如果我删除了一个系列,我还必须删除列表中的最后一个FixedSubPlan
,例如,如上所示,如果我删除 Family B ,我的{{1应该如下:
我已经有以下代码:
对于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
个对象;我会得到:
只有前两个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()
中。另外,我没有发布我的整个代码。这太冗长了。如果需要,我可以把它放在这里。感谢。
答案 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);
}