在Android中将List<List<String>>转换为ArrayList<String>

3

我希望把它们转换成 ArrayList 并将它们存储。然后,我必须将它们转换回旧值。你有什么建议吗?提前感谢。

public List<List<String>> phones = new ArrayList<>();
public List<List<Restaurant.Menu>> menus = new ArrayList<>(); 

public ArrayList<String> phones = ?
public ArrayList<String> menus = ?

你正在使用Java-8吗? - Ousmane D.
你需要将列表压平吗? - Basil Battikhi
我正在使用Android。Java可以帮助解决这个问题。任何解决方案都可以帮助 :) 我想将List<List转换为ArrayList,然后将ArrayList转换为List<List。 - ozo
4个回答

3

第一种情况下,您可以将电话嵌套列表展平为单个列表,然后收集到 ArrayList 中。

ArrayList<String> result = 
                  phones.stream()
                        .flatMap(Collection::stream)
                        .collect(Collectors.toCollection(ArrayList::new));

对于第二种情况,如果您已经重写了toString方法,则需要提取Menu对象的字符串表示形式;否则,您需要从Menu对象中提取某种属性以从Menu投影到String
如果您已经重写了toString方法,请按照以下方式执行:
ArrayList<String> menuResult = 
                  menus.stream()
                       .flatMap(Collection::stream)
                       .map(Menu::toString)
                       .collect(Collectors.toCollection(ArrayList::new));

如果你需要从菜单中提取某些属性,可以按照以下方式进行:

ArrayList<String> menuResult = 
                  menus.stream()
                       .flatMap(Collection::stream)
                       .map(Menu::getName)
                       .collect(Collectors.toCollection(ArrayList::new));

如果您的API级别不支持这些功能,则可以使用以下方法:
// flatten List<List<String>> to ArrayList<String>
ArrayList<String> phonesAccumulator = new ArrayList<>();
for (List<String> temp : phones) {
     phonesAccumulator.addAll(temp);
}

// flatten List<List<Restaurant.Menu>> to ArrayList<String>
ArrayList<String> menusAccumulator = new ArrayList<>();
for (List<Restaurant.Menu> temp : menus) {
    for(Restaurant.Menu m : temp){
       menusAccumulator.add(m.toString());
       // or m.getName();
    }
}

它可以工作,但在安卓系统中会出现API级别问题。 - ozo
谢谢您的第一部分。您能将ArrayList转换为List<List吗? - ozo
List<List<String>> menusAccumulator = new ArrayList<>(); for (List<Restaurant.Menu> temp : menus) { List<String> tempAccumulator = new ArrayList<>(); for(Restaurant.Menu m : temp){ tempAccumulator.add(m.toString()); // or m.getName(); } menusAccumulator.add(tempAccumulator); }菜单累加器列表是一个ArrayList,它包含了多个字符串列表。在循环中,我们遍历了菜单列表,并为每个菜单创建了一个临时累加器列表。然后,我们将每个菜单的名称或toString()方法返回的字符串添加到临时累加器列表中。最后,我们将临时累加器列表添加到菜单累加器列表中。 - Ousmane D.
抱歉,这段代码出了问题。我想在这个时候将menusAccumulator转换为List<List<Restaurant.Menu>> menus。 - ozo

0

我使用了Gson来解决它。我分享一个样例。

Gson gson = new Gson();
ArrayList<String> gsonString = new ArrayList<>();
for(int i=0; i<restaurants.size(); i++)
        gsonString.add(gson.toJson(restaurants.get(i)));
// Store it
tinydb.putListString("tinyRestaurant",gsonString);

再次转换

Gson gson = new Gson();
for(int i=0; i<tinydb.getListString("tinyRestaurant").size(); i++)
            restaurants.add(gson.fromJson(tinydb.getListString("tinyRestaurant").get(i), Restaurant.class));

0
如果您正在使用Java 8,flatMap在这里可能会很有用:
ArrayList<String> phoneList = phones.stream()
                                        .flatMap(List::stream)
                                        .collect(Collectors.toCollection(ArrayList::new));

0

我将按照以下所说的方式证明我的解决方案,因此您可以根据自己的需要进行更改 -

    List<String> nonvegList = new ArrayList<String>();
    nonvegList.add("Mutton Keema");
    nonvegList.add("Chicken Keema");
    nonvegList.add("Korma Veg Keema");
    nonvegList.add("Pulaav Biryaani");
    nonvegList.add("Mutton Biryaani");
    nonvegList.add("Chicken Biryaani");

    List<List<String>> menuList = new ArrayList<List<String>>();
    menuList.add(nonvegList);

    ArrayList<String> resultList = new ArrayList<String>(menuList.get(0));
    System.out.println(resultList);

简单易懂,格式清晰,兼容Java 6及以上版本,

希望这能对您有所帮助,谢谢。


我猜你为每个列表(行)创建了新的ArrayList。如果列表太长,这将是一个问题。 - ozo
看,你已经有一个列表了,我刚刚给出了7行代码以便你理解。实际上,我也可以将这些代码写成单行的形式。所以在这里,你有许多菜单列表,如vegList、nonvegList、iceCreamList、snacksList等,它们都被添加到了你的menuList(List<List<String>>)中。你可以轻松地声明一个arrayList对象,并在初始化时放入值的集合。 - ArifMustafa
抱歉,您能否编辑您的帖子并添加代码?我的思维有些混乱。我该如何一次性获取所有值。 - ozo
在将列表集合转换为类ArrayList之前,JVM首先从ArrayList<String>构造函数部分中的现有List<String>对象初始化ArrayList<String>,从而初始化resultList变量。这仅是可能的,因为Collection是类型List和ArrayList的超类。我认为我已经解释清楚了,如果有帮助,请将其标记为答案。 - ArifMustafa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接