Freemarker - Hilfe mit Sequences

Moin zusammen,

ich habe jetzt schon ein bisschen rumgerätselt aber komme leider nicht auf eine Lösung, die alle Fälle abdeckt.
Ich habe als Input 2 Sequences (max. length = 3) aus Strings und möchte, dass wenn im options_new Elemente drin sind, die auch schon in options_old enthalten sind, diese im Result den gleichen Index haben.
z.B.
options_old = [„Ausführung“]
options_new = [„Farbe“, „Ausführung“]
expected_result = [„Ausführung“, „Farbe“]

oder
options_old = [„Ausführung“, „Länge“, „Volumen“]
options_new = [„Länge“, „Ausführung“]
expected_result = [„Ausführung“, „Länge“]

oder
options_old = [„Ausführung“, „Länge“, „Volumen“]
options_new = [„Länge“, „Ausführung“, „Breite“]
expected_result = [„Ausführung“, „Länge, Breite“]

Dadurch, dass ich über Freemarker ja keine ja leider keine Sequences manipulieren kann (z.B. expected_result[i] = y), sondern diese nur über Konkatenationen verändern kann, fehlt mir leider ein Ansatz, das valide (und performant) umzusetzen - vielleicht hat ja einer von euch eine Idee? :slight_smile:

Danke schon einmal und beste Grüße
Tim

Probier mal diesen ChatGPT Vorschlag:

<#-- Angenommene Input-Listen -->
<#assign options_old = ["Ausführung", "Länge", "Volumen"]>
<#assign options_new = ["Länge", "Ausführung", "Breite"]>

<#-- Initialisiere die Ergebnisliste -->
<#assign expected_result = []>

<#-- Füge Elemente aus options_old hinzu, die in options_new vorkommen -->
<#list options_old as oldOption>
    <#if options_new?seq_contains(oldOption)>
        <#assign expected_result = expected_result + [oldOption]>
    </#if>
</#list>

<#-- Füge neue Elemente aus options_new hinzu -->
<#list options_new as newOption>
    <#if !expected_result?seq_contains(newOption)>
        <#assign expected_result = expected_result + [newOption]>
    </#if>
</#list>

<#-- Ausgabe der Ergebnisliste -->
<#list expected_result as result>
    ${result_index + 1}. ${result}<#if result_has_next>, </#if>
</#list>

Gerne können wir aber auch mal prüfen, ob wir noch eine Funktion (ähnlich den Mengen-Funktionen wie intersection() ) zur Verfügung stellen können.

1 Like

Hallo Tim,

wenn du die Anzahl an Konkatenationen verringern möchtest kannst du auch mit nur einer Ausführung auskommen.
Das machst du in dem du zuerst deine beiden Sequeneces auf die nur notwendigen Element reduzierst.
Für die Old Sequence sind das die Elemente, die behalten werden sollen.
Für die New Sequence sind das die Elemente die dazu kommen.
Die daraus neu entstehenden Sequences kannst du dann einmalig konkatenieren.
Siehe hierzu folgendes Beispiel:

<#assign options_old = ["Ausführung","Länge","Volumen"]>
<#assign options_new = ["Länge", "Ausführung", "Breite"]>
<#assign old_reduced = options_old?filter(x -> options_new?seq_contains(x))>
<#assign new_reduced = options_new?filter(x -> !options_old?seq_contains(x))>
<#assign result = old_reduced + new_reduced>
${result?join(";")}

Ich hoffe das Hilft an der Stelle.

Viele Grüße
Stefan

2 Likes

Moin zusammen,

sorry für die späte Rückmeldung, ich war die letzten Wochen im Urlaub :slight_smile:
Vielen Dank euch für die Ansätze, der Ansatz von Stefan funktioniert prima, 1000 Danke!

Beste Grüße
Tim