(ps。順列を扱っていると思ったので質問を書き直しましたが、実際には組み合わせを扱っています。)
をより具体的に考えてみましょうMap<String, List<WordGroupAndScore> baseMap
:
private static class WordGroupAndScore {
public final WordGroup wordGroup;
public final int score;
public WordGroupAndScore(final WordGroup wordGroup, final int score) {
this.wordGroup = wordGroup;
this.score = score;
}
}
は変数です。つまり、マップ内にbaseMap.size()
任意の数の が存在する可能性があります。String
また、 のすべての要素についてbaseMap
、baseMap.get(i).size()
は可変です。ただし、baseMap
に空のリストを含めることはできません。
今、私はすべての可能な組み合わせを見つけようとしています。コード自体は請求書のデータをチェックするためのものであり、すべてのデータが請求書で利用できるとは限らないため、可変量のbaseMap.size()
. baseMap
また、検出されるデータの量はそれがどの請求書であるかによって異なるため、要素ごとのリストは可変です。
(例のデータは実際には 1 対 1 で対応していませんが、例ではs またはs をWordGroupAndScore
使用してデータを表します)String
BigDecimal
baseMap
(値とキーのペア) 厳密に (A
と のペア)のデータ例List<B>
:
("invoiceNumber", ["0001", "0002"])
("invoiceDate", ["2013-10-07"])
("priceExclVAT, [new BigDecimal("10.00")])
("highVAT, [new BigDecimal("2.10")])
("priceInclVAT, [new BigDecimal("12.10"), new BigDecimal("14.10")])
データの可能なすべての組み合わせを生成したい。
出力例、1 つの (「最初の」) 組み合わせ (値と単一のキー ペア) 厳密 (A
とB
ペア):
("invoiceNumber", "0001")
("invoiceDate", "2013-10-07"])
("priceExclVAT, new BigDecimal("10.00"))
("highVAT, new BigDecimal("2.10"))
("priceInclVAT, new BigDecimal("12.10"))
出力例、1 つの (「最後の」) 組み合わせ (値と単一のキー ペア) 厳密 (A
とB
ペア):
("invoiceNumber", "0002")
("invoiceDate", "2013-10-07")
("priceExclVAT, new BigDecimal("10.00"))
("highVAT, new BigDecimal("2.10"))
("priceInclVAT, new BigDecimal("14.10"))
したがって、どういうわけか、すべてを反復処理し、baseMap
every に基づいてすべての組み合わせを記憶/作成する必要がありますbaseMap.get(i).size()
が、どこから始めればよいかほとんどわかりません。baseMap
最大の問題は、私のサイズが可変であるため、組み合わせをどのように覚えているかということです。変数がなければ、もっと簡単にできたのに。
質問が十分に明確であることを願っています。
編集:私の試みの1つを追加しましたが、うまくいきません。
//Assumes that wordGroupsAndScores does not get changed during the process
private void processWordGroupAndScores(TemplateBean template) {
System.out.println();
System.out.println("--wordGroupsAndScores--");
for (Map.Entry<String, List<WordGroupAndScore>> entry : wordGroupsAndScores.entrySet()) {
System.out.println("Attribute = " + entry.getKey());
for (WordGroupAndScore wordGroupAndScore : entry.getValue()) {
System.out.println("WordGroupAndScore = " + wordGroupAndScore);
}
System.out.println(";");
}
System.out.println();
//create all possible unfinishedinvoices from wordgroupandscores
int[] indices = new int[wordGroupsAndScores.keySet().size()];
for (int index = 0; index < indices.length; index++) {
indices[index] = 0;
}
String[] keyLocation = new String[wordGroupsAndScores.keySet().size()];
int j = 0;
for (String key : wordGroupsAndScores.keySet()) {
keyLocation[j] = key;
j++;
}
processWordGroupAndScoresRecursive(indices, keyLocation, template);
}
private void processWordGroupAndScoresRecursive(int[] indices, String[] keyLocation, TemplateBean template) {
processWordGroupAndScoresWithIndices(indices, keyLocation, template);
boolean changedIndices = false;
for (int index = indices.length - 1; index >= 0; index--) {
if (indices[index] < wordGroupsAndScores.get(keyLocation[index]).size() - 1) {
indices[index]++;
changedIndices = true;
break;
}
}
if (changedIndices) {
processWordGroupAndScoresRecursive(indices, keyLocation, template);
}
}
private void processWordGroupAndScoresWithIndices(int[] indices, String[] keyLocation, TemplateBean template) {
System.out.println();
System.out.println("--Generated combination--");
UnfinishedInvoice unfinishedInvoice = new UnfinishedInvoice();
for (int index = 0; index < indices.length; index++) {
String key = keyLocation[index];
WordGroupAndScore wordGroupAndScore = wordGroupsAndScores.get(key).get(indices[index]);
System.out.println("Attribute = " + key);
System.out.println("WordGroupAndScore = " + wordGroupAndScore);
System.out.println(";");
setUnfinishedInvoiceAttribute(key, unfinishedInvoice, Utils.joinWordGroup(wordGroupAndScore.wordGroup, " "), wordGroupAndScore.score);
}
System.out.println();
unfinishedInvoice.verify();
if (templateMap.containsKey(template)) {
templateMap.get(template).add(unfinishedInvoice);
}
else {
List<UnfinishedInvoice> list = new ArrayList<>();
list.add(unfinishedInvoice);
templateMap.put(template, list);
}
}
それが生成するものをより明確に見てみましょう。実際のデータではなく、インデックスのみを操作してみましょう。
これが入力であるとしましょう: [1, 1, 2, 1, 0]
. リストとしてのマップの特徴付けであり、元のマップ内のリスト内の要素のインデックスを要素として使用します。マップの最後の要素が取得される組み合わせから始めます。
私の失敗したコードでは、出力として次のようになります。
[1, 1, 2, 1, 0]
[1, 1, 2, 0, 0]
[1, 1, 1, 0, 0]
[1, 1, 0, 0, 0]
[1, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
が欠落しているなど、多くの値[0, 0, 0, 1, 0]
が欠落しているため、これは正しくありません。
ここで何がうまくいかないのですか?