我正在尝试编写返回createParther()
实例的公共实例方法Couple
。该方法通过遵循以下规则来完成其工作:夫妇中的一个舞者必须来自aList
而另一个bList
,一对夫妇中的一个舞者必须是男性而另一个是女性。这对夫妻中的舞者都不应该合作。如果无法从未组合的舞者中创建一对夫妇,则应返回null
。如果成功创建了Couple
的实例,那么参与这对夫妇的两个舞者应该将他们的合作实例变量设置为true
。我试图将所有aList
和bList
列在一起,但后来我不知道如上所述检查要求。任何人都能说明如何实现这一目标吗?这不是作业。
public class FoxDancing
{
private List<Couple> coupleList;
private List<Dancer> aList;
private List<Dancer> bList;
public FoxDancing()
{
couplesList = new ArrayList<Parthers>();
aList = new ArrayList<Dancer>();
bList = new ArrayList<Dancer>();
}
public void fieldLists()
{
this.addX("Simon","AList",'m');
this.addX("Jason","AList",'m');
this.addX("Ian","AList",'m');
this.addX("Susan","BList",'f');
this.addX("Helena","BList",'f');
this.addX("Gina","BList",'f');
}
}
答案 0 :(得分:3)
看起来你想要一个像这样的辅助方法:
Dancer findUnpartnered(List<Dancer> list) {
for (Dancer d : list) {
if (d.isUnpartnered()) {
return d;
}
}
return null;
}
这使用"foreach loop"对Dancer
中的所有List<Dancer>
进行简明易读的迭代。
然后你可以这样写:
Couple createCouple() {
Dancer a = findUnpartnered(aList);
Dancer b = findUnpartnered(bList);
if (a == null || b == null) {
return null;
} else {
a.setPartnered(true);
b.setPartnered(true);
return new Couple(a, b);
}
}
虽然这应该有用,但请注意findUnpartnered
是O(N)
线性搜索。如果列表具有相当长的长度,请考虑使用其他数据结构,例如:一个Set<Dancer>
,用于将列表划分为未合作和合作的子集。
你写了以下内容:
// snippet from original code
private List<Couple> coupleList;
//...
couplesList = new ArrayList<Parthers>(); // DOES NOT COMPILE!
这不会编译。 List<Partner>
(假设这是您打算写的)是 NOT a List<Couple>
。也许你想要一个new ArrayList<Couple>
,或者Partner
是[{1}}的子类型,那么也许你想要一个Couple
。
List<? extends Couple> coupleList
你写了以下内容:
enum
我对Foxtrot跳舞知之甚少,但如果有概念 A-list 和 B-list ,那么你可以考虑使用{{1}而不是// snippet from original code
this.addX("Simon","AList",'m');
this.addX("Susan","BList",'f');
// potentially "bad" use of String and char constants!
标记enum
和String
。同样,如果只有男性或女性舞者,则"AList"
会比"BList"
和enum
好得多。< / p>
'm'
答案 1 :(得分:3)
也许我并不完全理解您的要求,但由于看起来aList
由男性和bList
女性组成,这可能就像将两个名单混合并将夫妻配对一样简单一个循环,直到一个列表为空。
答案 2 :(得分:0)
首先写一下舞蹈课,完成你需要的所有方法。然后考虑是否要创建一对情侣的实例,或者如果您只想让每个舞者都参考他们的伴侣。一旦你到达这一点,剩下的应该开始落实到位。 :d