String Array basierend auf int Array füllen

Kababär

Top Contributor
Hi,

gegeben ist eine Zeile aus einer csv-Datei, gesplittet sind die Werte durch ein ":" (Doppelpunkt).
Diese Zeile lese ich ein und mache mit String.split(":"); ein Stringarray daraus.
Jetzt, basierend auf dem Inhalt der Zeile, will ich auf verschiedene Indices zugreifen.
Es gibt nur zwei Möglichkeiten, entweder das Array enthält einen gesuchten String, dann hätte ich gerne andere Indices als String. Anderenfalls nehme andere Indices..
Bisher habe ich dies:

Code:
 static String[] matchesExpressionLineout = new String[]{"Dude",
            "Amigo"};

        int[] ind1= new int[]{0, 1, 5, 10, 12, 14, 15, 16, 17, 18, 19};

        int[] ind2= new int[]{0, 1, 5, 11, 13, 14, 15};

        public static String[] getData(String line) {
            if (line == null || line.isEmpty() || line.length() < 8
                  || !line.contains(":")) {
                return null;
            }
            String[] a = line.split(":");

            boolean normalLine = true;
            for (String s : matchesEx) {
                for (String s2 : a) {
                    if (!s2.isEmpty() && s.contains(s2)) {
                        normalLine = false;
                        break;
                    }
                }
                if (!normalLine) {
                    break;
                }
            }
            return (normalLine)
                  ? new String[]{a[0], a[1], a[5], a[10], a[12], a[14], a[15], a[16], a[17], a[18], a[19]}
                  : new String[]{a[0], a[1], a[5], a[11], a[13], a[14], a[15]};

        }
Die Idee dahinter ist, dass ich nur oben die int_indices anpassen müsste und somit die Änderungen im Ganzen Code übernommen werden, da ich im Code über getData auf die Inhalte zugreife.
Man sieht, dass ich oben schon die int_arrays initialisiert habe, aber im return trotzdem alle indices manuell hingeschrieben habe.
Kann ich die int-arrays irgendwie in die Initialisierungsblöcke der String-Arrays im return implementieren?
Ist so was realisierbar und wenn ja wie?
 
Falls du Java 8 benutzt kannst, ist sowas möglich:

Java:
import java.util.Arrays;

public class Snippet {
    static String[] matchesEx = new String[] { "Dude", "Amigo" };

    static int[] ind1 = new int[] { 0, 1, 5, 10, 12, 14, 15, 16, 17, 18, 19 };

    static int[] ind2 = new int[] { 0, 1, 5, 11, 13, 14, 15 };

    public static String[] getData(String line) {
        if (line == null || line.isEmpty() || line.length() < 8
                || !line.contains(":")) {
            return null;
        }
        String[] a = line.split(":");

        boolean normalLine = true;
        for (String s : matchesEx) {
            for (String s2 : a) {
                if (!s2.isEmpty() && s.contains(s2)) {
                    normalLine = false;
                    break;
                }
            }
            if (!normalLine) {
                break;
            }
        }

        int indices[] = normalLine ? ind1 : ind2;
        return Arrays.stream(indices).mapToObj(i -> a[i])
                .toArray(size -> new String[size]);

    }
}

Achso und ich denke ein regulärer Ausdruck wäre auch noch schöner, um zu testen, ob die Wörter enthalten sind, oder nicht.

EDIT: Was mir erst jetzt auffält: Könnte nicht der ursprüngliche String, also line, auf die Wörter getestet werden? Dann spart man sich die for-Schleife. Und mit einem regulären Ausdrück wäre die Abfrage dann noch eine Zeile.
 
Wow echt Klasse Lösung darauf wäre ich nicht gekommen 🙂
Lambdas sind einfach so stark! (aber ineffizient?)
Muss mich unbedingt mal mehr damit beschäftigen. Bisher kann ich nur filtern und forEach ... 😀

Mit dem regulären Ausdruck, naja weiß nicht, bisher sind das nur Wörter für Testzwecke. Es kann vorkommen, dass sich die Wortliste im Laufe der Zeit verändert und es gibt viele solcher Wörter, die es zu überprüfen gibt (in mehreren Klassen, aber die Wörter an sich sind Konstante).
 

Zurück
Oben