少し苦労している問題があります。任意の数の配列と「特異性」と呼ばれる整数が与えられた場合、配列の外積内のその点を表す行を生成する必要があります。配列の長さは常に 2 以上で、各配列の最後の値は常に null です。各配列の最後の要素を除いて、他の要素が null になることはありません。たとえば、配列 {1, 2, null} と {A, B, null} が与えられた場合、外積は実質的に次のようになります。
0: 1 A
1: 1 B
2: 1 null
3: 2 A
4: 2 B
5: 2 null
6: null A
7: null B
8: null null
したがって、たとえば上記の 2 つの配列で「特異性」が 4 の場合、配列 {2, B} が返されます。それは簡単な部分です。以下のコードセクションで、この特定のケースを完了しました。ただし、null のない組み合わせが優先される場合を考えてみましょう。順序は次のようになります。
0: 1 A
1: 1 B
2: 2 A
3: 2 B
4: 1 null
5: 2 null
6: null A
7: null B
8: null null
これまでに実装したアルゴリズムは次のとおりです。上記の最初のケースは問題なく処理されますが、2 番目のケースはどうすればよいかわかりません。「else」句に何が入るかについて何か考えはありますか?
public static String generateKeyForSource(int specificity, KeySource keySource) {
if (specificity > keySource.getNumPossibleKeys()) {
throw new IllegalArgumentException("The specificity " + specificity + " is larger than the max number of possible keys for this KeySource, which is " + keySource.getNumPossibleKeys());
}
Object[][] hierarchies = keySource.getHierarchies();
boolean combinedPrecedence = keySource.isCombinedPrecedence();
int[] indexes = new int[hierarchies.length];
int multiplier = 1;
if (!(combinedPrecedence && specificity >= keySource.getFirstSpecificityContainingNull())) {
for (int i = hierarchies.length - 1; i >= 0; i--) {
Object[] hierarchy = hierarchies[i];
int range;
if (combinedPrecedence)
range = hierarchy.length - 1;
else
range = hierarchy.length;
int currentArrayIndex = specificity / multiplier % range;
indexes[i] = currentArrayIndex;
multiplier *= hierarchies[i].length;
}
}
else {
//?????????
}
return generateKey(indexes, hierarchies);
}