在指定数量的元素之间打印一组条件
Printing a set of conditions between a specified number of elements
作为生成文本输出文件的程序的一部分,我需要插入一个预定义的数字 n(对应于所需元素的数量)并自动创建条件他们。
例如对于 n=3,生成元素 s1、s2 和 s3。我想实现的是自动生成如下条件,打印到文本文件中:
s1<s2 & s1<s3
s2<=s1 & s2<s3
s3<=s1 & s3<=s2
以上条件涵盖了元素之间所有可能的组合。到目前为止,我所拥有的是一个 ArrayList
,它包含与预定义数字 n 一样多的元素和以下代码以产生所需的结果:
int counter = 0;
ArrayList<String> state = new ArrayList<String>();
for (int i=0; i<=n; i++) {
state.add(i,"s"+1));
}
for (int j=1; j<=n; j++) {
for (int i=0; i<(n-1); i++) {
if (i==(n-2)) {
fw.write(state.get(i)+"<"+state.get(counter));
}
else {
fw.write(state.get(i)+"<"+state.get(counter)+" & ");
}
}
counter++;
}
我知道在这种情况下使用 counter
是不正确的,但我想不出一种方法来正确表示不同的条件。
更新:
使用以下代码进行测试,我设法接近预期的结果:
ArrayList<String> collectStates = new ArrayList<String>();
String activeState,writtenState;
for (int i=0; i<n; i++) {
for (int j=0; j<state.size(); j++) {
if (state.get(i) != state.get(j)) {
activeState=state.get(i)+"<"+state.get(j);
writtenState=state.get(j)+"<"+state.get(i);
if (collectStates.contains(activeState)) {
System.out.print(state.get(i)+"<="+state.get(j));
}
else {
System.out.print(activeState);
}
if (j!=state.size()-1) {
System.out.print(" & ");
}
collectStates.add(writtenState);
}
}
System.out.print("\n");
}
我收到的输出是:
s1<s2 & s1<s3
s2<=s1 & s2<s3
s3<=s1 & s3<=s2 &
唯一的问题是最后一行末尾的额外 &
,我还不知道如何解决。
我找到了问题的答案!在描述的更新部分中,我执行了以下添加以删除额外的 &
符号:
旧版本:
if (j!=state.size()-1) {
System.out.print(" & ");
}
更新版本:
if ((j!=state.size()-1) && ((j!=state.size()-2) || (i!=state.size()-1))) {
fw.write(" & ");
}
问题总是出现在输出条件的最后一行,因此是最新的修复。输出现在与描述中描述的完全一样。
更详细地说,程序所做的是删除相同的值:
s1?s1 & s1?s2 & s1?s3
s2?s1 & s2?s2 & s2?s3
s3?s1 & s3?s2 & s3?s3
所以通过删除:
s1?s1 &
我们保持 s1?s2 & s1?s3
s2?s2 &
我们保持 s2?s1 & s2?s3
s3?s3
我们保持 s3?s1 & s3?s2 &
因此,需要添加新条件以删除最后一行中多余的 &
。
作为生成文本输出文件的程序的一部分,我需要插入一个预定义的数字 n(对应于所需元素的数量)并自动创建条件他们。
例如对于 n=3,生成元素 s1、s2 和 s3。我想实现的是自动生成如下条件,打印到文本文件中:
s1<s2 & s1<s3
s2<=s1 & s2<s3
s3<=s1 & s3<=s2
以上条件涵盖了元素之间所有可能的组合。到目前为止,我所拥有的是一个 ArrayList
,它包含与预定义数字 n 一样多的元素和以下代码以产生所需的结果:
int counter = 0;
ArrayList<String> state = new ArrayList<String>();
for (int i=0; i<=n; i++) {
state.add(i,"s"+1));
}
for (int j=1; j<=n; j++) {
for (int i=0; i<(n-1); i++) {
if (i==(n-2)) {
fw.write(state.get(i)+"<"+state.get(counter));
}
else {
fw.write(state.get(i)+"<"+state.get(counter)+" & ");
}
}
counter++;
}
我知道在这种情况下使用 counter
是不正确的,但我想不出一种方法来正确表示不同的条件。
更新:
使用以下代码进行测试,我设法接近预期的结果:
ArrayList<String> collectStates = new ArrayList<String>();
String activeState,writtenState;
for (int i=0; i<n; i++) {
for (int j=0; j<state.size(); j++) {
if (state.get(i) != state.get(j)) {
activeState=state.get(i)+"<"+state.get(j);
writtenState=state.get(j)+"<"+state.get(i);
if (collectStates.contains(activeState)) {
System.out.print(state.get(i)+"<="+state.get(j));
}
else {
System.out.print(activeState);
}
if (j!=state.size()-1) {
System.out.print(" & ");
}
collectStates.add(writtenState);
}
}
System.out.print("\n");
}
我收到的输出是:
s1<s2 & s1<s3
s2<=s1 & s2<s3
s3<=s1 & s3<=s2 &
唯一的问题是最后一行末尾的额外 &
,我还不知道如何解决。
我找到了问题的答案!在描述的更新部分中,我执行了以下添加以删除额外的 &
符号:
旧版本:
if (j!=state.size()-1) {
System.out.print(" & ");
}
更新版本:
if ((j!=state.size()-1) && ((j!=state.size()-2) || (i!=state.size()-1))) {
fw.write(" & ");
}
问题总是出现在输出条件的最后一行,因此是最新的修复。输出现在与描述中描述的完全一样。
更详细地说,程序所做的是删除相同的值:
s1?s1 & s1?s2 & s1?s3
s2?s1 & s2?s2 & s2?s3
s3?s1 & s3?s2 & s3?s3
所以通过删除:
s1?s1 &
我们保持 s1?s2 & s1?s3
s2?s2 &
我们保持 s2?s1 & s2?s3
s3?s3
我们保持 s3?s1 & s3?s2 &
因此,需要添加新条件以删除最后一行中多余的 &
。