【问题标题】:Convert List<List<String>> to ArrayList<String> in Android在 Android 中将 List<List<String>> 转换为 ArrayList<String>
【发布时间】:2018-06-11 00:41:15
【问题描述】:

我想将它们转换为 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 吗?
  • 所以你需要把列表变平吗?
  • 我正在使用安卓。 Java 可以为此提供帮助。任何解决方案都可以提供帮助:) 之后我想将 List

标签: java android list arraylist type-conversion


【解决方案1】:

对于第一种情况,您可以将手机嵌套列表展平为单个列表,然后收集到ArrayList

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

对于第二种情况,您需要提取 Menu 对象的字符串表示形式,因为您已覆盖 toString,否则您需要按顺序从 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();
    }
}

【讨论】:

  • 它可以工作,但它在android中给出了api级别的问题。
  • 感谢您的第一部分。您可以将 ArrayList 转换为 List
  • List&lt;List&lt;String&gt;&gt; menusAccumulator = new ArrayList&lt;&gt;(); for (List&lt;Restaurant.Menu&gt; temp : menus) { List&lt;String&gt; tempAccumulator = new ArrayList&lt;&gt;(); for(Restaurant.Menu m : temp){ tempAccumulator.add(m.toString()); // or m.getName(); } menusAccumulator.add(tempAccumulator); } ?
  • 对不起,这段代码有问题。这次我想将 menusAccumulator 转换为 List> 菜单;
【解决方案2】:

如果您使用的是 Java 8,flatMap 在这里会很有用:

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

【讨论】:

    【解决方案3】:

    我正在证明我的决议如下所述,因此您可以根据自己的意愿进行更改 -

        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。如果列表太长,就会有问题。
    • 你看,你已经有一个列表了,我刚刚给出了7行代码让你理解正确,我也可以单行写这种东西,所以这里有很多菜单列表像 vegList、nonvegList、iceCreamList、snacksList 等添加到您的 menuList (List>) 中,您可以轻松地声明一个 arrayList 对象并在初始化时放置值集合。
    • 抱歉,您可以编辑您的帖子并添加代码吗?我的头脑有些混乱。如何一次获取所有值。
    • 这里在将列表集合转换为类ArrayList之前,JVM首先从ArrayList构造函数部分中已有的List对象初始化ArrayList,从而初始化resultList变量这是可能的,因为 Collection 是 List 和 ArrayList 类型的超类,我想我已经解释过了,如果发现有帮助,请将其标记为答案。
    【解决方案4】:

    我用 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));
    

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 2019-09-10
      • 2021-01-13
      相关资源
      最近更新 更多