Brauchbare Schleife für Datenvergleich
romero
- javascript
hallo liebe gemeinde,
hab da wieder ein problem, wo ich z.z. nicht weiter komme.
ich möchte gern 2 listen (array's) mit einander vergleichen. das problem dabei ist, dass es dabei zu unterschiedlichen längen der listen kommen kann.
man könnte zwar 2 verschachtelte for-schleifen schreiben und mit einander vergleichen und dabei die unterschiede ausgeben, aber ich möchte da halt eine erweiterung einbauen. denn das mit den 2 for-schleifen ist für mich kein problem. habe grad, sozusagen, ein kleines logik-problem, wie ich es für meine wünsche, fertigstelle.
hier kurz mein bsp:
D258_70100_032W_20b.nc --> D258_70100_032N_20b.nc
D258_70101_032S_20b.nc --> D258_70101_032D_20b.nc
... --> ...
D258_70160_026V_10j.nc --> D258_70160_026V_20b.nc oder ---
D258_70160_026V_20b.nc --> D258_70160_026V_20b.nc
... --> ...
D258_70181_028N_11j.nc --> D258_70181_028N_20b.nc oder ---
D258_70181_028N_12j.nc --> D258_70181_028N_20b.nc oder ---
D258_70181_028N_20b.nc --> D258_70181_028N_20b.nc
...
D258_70092_022L_20b_5.nc --> D258_70092_022L_20b_3.nc
... --> ...
die "..." sind weitere daten.
wichtig sind hierbei die ersten 11 stellen, also z.b. "d258_70100_". das ist der sogenannte hauptteil. danach folg mit z.b. "032" die variante (welche variieren kann). weiterhin der issue, dies beschreibt die aktualität des bauteils, je höher der buchstabe, desto aktueller das bauteil. als letztes folgt das material des bauteils. dies kann aus einem werkstoff sein, oder auch als mehreren teilen bestehen, je nachdem, was verlangt ist.
soweit die ausgangssituation.
nun sollen aber die beiden listen verglichen werden, dabei ist egal (anhand des bsp) welche liste bereits vorhanden bzw länger ist oder nicht.
man sieht auf der rechten seite z.b den einen bauteil mit issue W den anderen mit issue N, also ist hier ein unterschied zu erkennen. das klappt soweit auch ganz gut.
nun kommt es aber dazu, dass eventuell weitere bauteile dazukommen oder sogar wegfallen. wenn ich es aber mit den 2 verschachtelten schleifen durchlaufen lasse dann bringt er mir mit dem oben genannten bsp. folgendes aus:
D258_70160_026V_10j.nc --> D258_70160_026V_20b.nc
aber ich weiß ja nicht, was da noch dazu gehört? entweder ein neues material oder das bauteil besteht aus 2 verschiedenen materialien. das sehe ich nicht. nur wenn ich mir das bauteil angucke, sehe ich was wirklich da ist. das will ich aber schon anhand des vergleiches sehen.
also wäre das
D258_70160_026V_10j.nc --> D258_70160_026V_20b.nc oder ---
D258_70160_026V_20b.nc --> D258_70160_026V_20b.nc
die richtige ausgabe. das ich sehe, dass ein weiteres material dazugekommen ist.
das selbe ist bei der anzahl der fall, da aber tun die 2 verschachtelten schleifen das schon, sollte aber nur als anmerkung dazu, dass die schleifen das auch können.
wichtig ist halt zu sagen, dass erst das bauteil-hauptteil gilt, dann die variante, dann der issue und dann das material.
ps: mein script liegt als *.hta-datei vor
pps: ich hoffe ihr konntet mir folgen.
lg romero
Hallo,
[...] (irgendwas mit Bauteilen)
ich habe nicht verstanden, auf welche Probleme du beim Vergleichen von zwei Listen gestoßen bist.
Aber du möchtest die Listen nicht nur nach einem Merkmal vergleichen/durchsuchen, sondern nach 4(?). Dann benötitgst du in der einfachen for-Variante auch 4 Schleifen, um nach jedem Merkmal einzeln suchen (bzw. vergleichen) zu können.
Auch ist bei Fragen nach Logik in einem Algorithmus ein Stückchen relevanter Code sehr hilfreich. Dann können die Mitlesenden direkt sehen, was dein Algorithmus macht (oder auch nicht).
Grüße
Hallo,
[...] (irgendwas mit Bauteilen)
ich habe nicht verstanden, auf welche Probleme du beim Vergleichen von zwei Listen gestoßen bist.Aber du möchtest die Listen nicht nur nach einem Merkmal vergleichen/durchsuchen, sondern nach 4(?). Dann benötitgst du in der einfachen for-Variante auch 4 Schleifen, um nach jedem Merkmal einzeln suchen (bzw. vergleichen) zu können.
»»
hier mal der code:
var ZählerUngleicherMatten = 0;
if( infile_neu.length < infile_vorhanden.length )
{
var STL_gr = infile_vorhanden;
var STL_kl = infile_neu;
} else {
var STL_gr = infile_neu;
var STL_kl = infile_vorhanden;
};
for( var i = 0; i < STL_kl.length; i++ ) //--> kleinere Liste für die 1. Schleife
{
for( var j = 0; j < STL_gr.length; j++ ) //--> größere Liste für die 2. Schleife
{
if( STL_kl[i].substr( 7, 1 ) != "0" && STL_gr[j].substr( 7, 1 ) != "0" ) //--> Unterscheidung ob "Zusatzmatte" oder nicht
{
if( STL_kl[i].substr( 0, 10 ) == STL_gr[j].substr( 0, 10 ) ) //--> Vergleich der 1. und 2. Liste als Teilstring
{
if( STL_kl[i] != STL_gr[j] ) //--> Vergleich der beiden Listen
{
ZählerUngleicherMatten++;
if( infile_neu.length < infile_vorhanden.length )
{
infile_vorhanden = STL_gr;
infile_neu = STL_kl;
msg( "<b>" + infile_neu[i] + "</b> --> " + infile_vorhanden[j] + "<br>" );
} else {
infile_vorhanden = STL_kl;
infile_neu = STL_gr;
msg( "<b>" + infile_neu[j] + "</b> --> " + infile_vorhanden[i] + "<br>" );
};
};
};
} else {
if( STL_kl[i].substr( 0, 14 ) == STL_gr[j].substr( 0, 14 ) )
{
if( STL_kl[i] != STL_gr[j] )
{
ZählerUngleicherMatten++;
if( infile_neu.length < infile_vorhanden.length )
{
infile_vorhanden = STL_gr;
infile_neu = STL_kl;
msg( "<b>" + infile_neu[i] + "</b> --> " + infile_vorhanden[j] + "<br>" );
} else {
infile_vorhanden = STL_kl;
infile_neu = STL_gr;
msg( "<b>" + infile_neu[j] + "</b> --> " + infile_vorhanden[i] + "<br>" );
};
};
};
};
};
};
es soll nicht nach 4 merkmalen verglichen werden, sondern wenn ein bauteil in der einen liste aus 2 (oder mehreren) teilen bestehen und in der anderen liste aus 1 bauteil, dann soll er halt das ausgeben:
D258_70160_026V_10j.nc --> D258_70160_026V_20b.nc oder ---
D258_70160_026V_20b.nc --> D258_70160_026V_20b.nc
... --> ...
D258_70181_028N_11j.nc --> D258_70181_028N_20b.nc oder ---
D258_70181_028N_12j.nc --> D258_70181_028N_20b.nc oder ---
D258_70181_028N_20b.nc --> D258_70181_028N_20b.nc
aber mit den oben genannten verschachtelten schleifen gibt er folgendes aus:
D258_70160_026V_10j.nc --> D258_70160_026V_20b.nc
... --> ...
D258_70181_028N_11j.nc --> D258_70181_028N_20b.nc
D258_70181_028N_12j.nc --> D258_70181_028N_20b.nc
das reicht mir halt nicht aus. denn es sollen halt alle einzelmaterialien angezeigt werden. auch wenn diese übereinstimmen (anhand des bauteils).
deswegen wollt ich halt ich fragen, wie es zu ermöglichen ist. hab da grad sicherlich ein denkfehler bzw. ein logik-proglem in meinem köppel :)
denn ich weiß halt nicht, welche verschiedenen materialien halt vorkommen können und deshalb kann ich es auch nicht danach abfragen.
lg romero