Конкатенация строк содержимого ЗНАЧЕНИЯ нескольких массивов.Странная проблема - PullRequest
0 голосов
/ 22 сентября 2011

У меня много Arraylists, имеющих String объектов, и у меня есть требование объединить там значения.
Например:

ArrayList finalList = new ArrayList();
ArrayList catMe = new ArrayList();
ArrayList x = new ArrayList();
x.add("Green");
x.add("Red");
ArrayList y = new ArrayList();
y.add(" Apple");

//......

catMe.add(x);
catMe.add(y);

concatContents(catMe);  // Here i need to do 
                        // some concatenation magic.

, поэтому при печати finalList:

finalList.get(0) // should show > "Green Apple"
finalList.get(1) // should show >  "Red Apple"

Я знаю, это выглядит легко, если есть только два списка X и Y ... но мне это нужно для n измерений.Скажите, если есть 3-й список

ArrayList z= new ArrayList();
z.add(" USA");
z.add(" Canada");
catMe.add(z);
concatContents(catMe);

Теперь finalList должен показать

Green Apple USA
Green Apple Canada
Red Apple USA
Red Apple Canada

Нужна ли мне рекурсия?Невозможно думать, как реализовать, хотя!У какого-нибудь Java-мастера есть решение?

Ответы [ 4 ]

1 голос
/ 22 сентября 2011

Вот рекурсивный ответ.Просто приготовил, так что никаких гарантий по качеству ... :)

public ArrayList<String> concatLists(ArrayList<ArrayList<String>> list) {
    ArrayList<String> catStrs = new ArrayList<String>();
    int len = list.size();
    if (len == 1) {
        catStrs.addAll(list.get(0));
        return catStrs;
    }
    ArrayList<String> myStrs = list.get(0);
    ArrayList<ArrayList<String>> strs = new ArrayList<ArrayList<String>>();
    strs.addAll(list.subList(1, len));
    ArrayList<String> retStrs = concatLists(strs);
    for (String str : myStrs) {
        for (String retStr : retStrs) {
            catStrs.add(str+retStr);
        }
    }
    return catStrs;
}
1 голос
/ 22 сентября 2011

Быстрое и грязное решение:

public class Lists {
    public static void main(String[] args) {
        List<List<String>> finalList = new ArrayList<List<String>>();

        List<String> x = new ArrayList<String>();
        x.add("Green");
        x.add("Red");
        x.add("Purple");

        List<String> y = new ArrayList<String>();
        y.add("Apple");

        List<String> z = new ArrayList<String>();
        z.add("USA");
        z.add("UK");
        z.add("France");

        finalList.add(x);
        finalList.add(y);
        finalList.add(z);

        for (String s: concat(finalList)) {
            System.out.println(s);
        }
    }

    private static List<String> concat(List<List<String>> inputList) {
        if (inputList.size() == 1) {
            return inputList.get(0);
        } else {
            List<String> newList = new ArrayList<String>();
            List<String> prefixes = inputList.get(0);
            for (String prefix : prefixes) {
                for (String concat : concat(inputList.subList(1,inputList.size()))) {
                    newList.add(prefix + " " + concat);
                }
            }

            return newList;
        }
    }
}

дает:

Green Apple USA
Green Apple UK
Green Apple France
Red Apple USA
Red Apple UK
Red Apple France
Purple Apple USA
Purple Apple UK
Purple Apple France
1 голос
/ 22 сентября 2011

что-то вроде этого должно работать. (Я на самом деле не скомпилировал это, для простоты написал его как псевдокод sorta. Позаботьтесь о обобщениях и правильных типах List>)

List<ArrayList> lists;  // add all your lists to this list
ArrayList<String> final_list; // your final list of concatenations

for (int i=0; i<list1.size(); i++) {
    String temp = ""
    for (ArrayList current_list : lists) {
       temp += " " +current_list.get(i);
    }
    final_list.add(temp);
}

РЕДАКТИРОВАТЬ - хорошо, поэтому приведенный выше код был немного глупым, я не правильно понял вопрос. Теперь, когда другие опубликовали рекурсивные решения, я подумал, что окупится, разместив нерекурсивное рабочее решение. Итак, вот тот, который работает именно так, как ожидалось

public static void main(String[] args) {
    ArrayList<String> finalList = new ArrayList<String>();
    ArrayList<String> x = new ArrayList<String>();
    x.add("Green");
    x.add("Red");
    ArrayList<String> y = new ArrayList<String>();
    y.add(" Apple");
    ArrayList<String> z = new ArrayList<String>();
    z.add(" USA");
    z.add(" Canada");
    finalList = concat(x, y, z);
    System.out.println(finalList);
}

static ArrayList<String> concat(ArrayList<String>... lists) {
    ArrayList<String> result = new ArrayList<String>();
    for (ArrayList<String> list : lists) {
        result = multiply(result, list);
    }
    return result;
}

static ArrayList<String> multiply(ArrayList<String> list1, ArrayList<String> list2) {
    if (list2.isEmpty()) { return list1; }
    if (list1.isEmpty()) { return list2; }

    ArrayList<String> result = new ArrayList<String>();
    for (String item2 : list2) {
        for (String item1 : list1) {
            result.add(item1 + item2);
        }
    }
    return result;
}
0 голосов
/ 22 сентября 2011

Вот моя простая реализация:

List<ArrayList<String>> lists= new ArrayList<ArrayList<String>>();
        ArrayList<String> final_list=new ArrayList<String>();;
            int i=0;
        while(true){
            StringBuilder temp = new StringBuilder();

           for(ArrayList<String> currentList:lists){
            if(i<currentList.size()){
                temp.append(currentList.get(i));
            }
           }
           String row = temp.toString();
           if(row.length()==0){
               break;

           } else{
               final_list.add(row);
               i++;
           }
        }
...