java - فلاتن صفائف متداخلة.(جافا)



arraylist flatten (1)

أنا تكافح من أجل خلق المنطق الصحيح لتسطيح مجموعة. أريد أساسا تكرار الصفوف الأصل لكل عنصر فرعي في صفيف متداخل. قد يختلف عدد الصفائف المتداخلة. لقد تم إنشاء قوائم جافا بك أجد لهم سهلة للعمل مع، ولكن مفتوحة على أي حل. طبيعة هذه المشكلة هو أنني بدأت مع بعض جسون المتداخلة التي أريد تحويلها إلى كسف شقة لتحميل في جدول قاعدة بيانات. شكرا للمساعدة.

مثال:

[1,2,[A,B,[Cat,Dog]],3]

لقد قمت بإنشاء ما سبق كقائمة. كل عنصر إما سلسلة أو قائمة أخرى.

نتيجة:

[1,2,A,Cat,3],
[1,2,A,Dog,3],
[1,2,B,Cat,3],
[1,2,B,Dog,3]

وهنا ما لدي حتى الآن. من الواضح لا يعمل.

private static List<List<String>> processData(List<String> row, List<Object> data, List<List<String>> rowList) {
    List<List<String>> tempRowList = new ArrayList<List<String>>();
    for (Object i : data) {
        if (i instanceof List<?>) {
            flattenArray((List<Object>) i, row, rowList);
        } else {
            for (List<String> r : rowList) {
                r.add(i.toString()); //add item to all rows
            }
        }
    }
    return rowList;

private static void flattenArray(List<Object> arrayObject, List<String> rowToCopy, List<List<String>> rowList) {

    for (Object x : arrayObject) {

        if (x instanceof List<?>) {
            for (List<String> t : rowList) {
                flattenArray((List<Object>) x, t, rowList);
            }

        } else {
            List<String> newRow = new ArrayList<String>(rowToCopy); //copy row

            List<Object> t = new ArrayList<Object>();
            t.add(x);

            List<List<String>> innerRowList = new ArrayList<List<String>>();
            innerRowList.add(newRow);

            processData(newRow, t, innerRowList); //pass in new copied row. object to add, 
            rowList.add(newRow);

        }

    }
    rowList.remove(rowToCopy);
}

وأنا وضعت كل شيء مثل هذا.

public static void main(String[] args) {

    List<Object> data = new ArrayList<Object>();
    List<List<String>> rowList = new ArrayList<List<String>>();

    data.add("1");
    data.add("2");

    List<Object> l1 = new ArrayList<Object>();
    l1.add("A");
    l1.add("B");        
    List<Object> l2 = new ArrayList<Object>();
    l2.add("dog");
    l2.add("cat");
    l1.add(l2);
    data.add(l1);

    data.add("3");

    List<String> r0 = new ArrayList<String>();
    rowList.add(r0);
    System.out.println(data);
    rowList = processData(r0, data, rowList);
    System.out.println(rowList);
}

أعتقد أن هذا يجب أن يعمل لك إذا كنت تستخدم جافا 8:

    List<Object> a = new ArrayList<>();
    List<Object> a1 = new ArrayList<>();
    a1.add("v");
    a1.add("w");
    List<Object> a2 = new ArrayList<>();
    a2.add("ww");
    a.add("a");
    a.add("b");
    a.add("c");
    a.add("d");
    a.add(a1);
    a.add(a2);
    List<Object> b = new ArrayList<>();

    a.stream().flatMap(x -> x instanceof String ? Stream.of(x) : ((List) x).stream()).forEach(b::add);

    System.out.println(a);
    System.out.println(b);

b سوف تحتوي قائمة بالارض. الناتج هو:

[a, b, c, d, [v, w], [ww]]
[a, b, c, d, v, w, ww]




flatten