【问题标题】:How to convert a String arrayList to a boolean arrayList?如何将字符串数组列表转换为布尔数组列表?
【发布时间】:2018-10-18 14:15:11
【问题描述】:

我正在使用 Java 7,我从 api 获得了一个字符串列表,如下所示:

List = ["ON","OFF"];

所以我把它改成:

List = ["true","false"];

我想将最后一个更改为布尔列表:

List = [true,false];

这就是我所做的:

String responseapi = response.asString();
                        responseapi= responseapi.replace("ON", String.valueOf(true));
                        responseapi= responseapi.replace("OFF", "false");
                      ArrayList<String> stats = new ArrayList<>();
                        stats.add(responseapi);
                      ArrayList<Boolean> stats = new ArrayList<>();

                        for(String x:stats){
                            stats1.add(Boolean.parseBoolean(x));
                            System.out.println("hi"+stats1);

                        }

问题是我得到了:

List = [false,false];

【问题讨论】:

  • response 是什么列表?
  • 这是来自 API 的响应,它包含两个字符串“ON”和“OFF”
  • 请写一个response内容的例子。
  • 另外一件事,注意你把String和Boolean的ArrayList都命名为stats
  • 已经给出了几个答案应该可以解决您的问题,但我很难相信您提供的代码是您用于测试的代码:您声明了两个具有相同名称的变量这应该会导致编译错误。您只向第一个列表添加一个值,但声称您以包含两个元素的结果列表结束。为了将来,请始终发布您用于测试的实际代码,否则很难提供帮助。

标签: java android arraylist boolean


【解决方案1】:

使用原始列表,您可以像这样使用流 api。

这是假设您的响应列表不为空且不包含任何空值。

List<String> response = ... // {"ON", "OFF", "ON", "ON", "OFF"}

对于 Java 8+:

List<Boolean> booleanList = response.stream()
    .map(s -> "ON".equalsIgnoreCase(s.trim()))
    .collect(Collectors.toList());

// booleanList == {true, false, true, true, false}

对于 Java 8 之前的版本:

List<Boolean> booleanList = new ArrayList<>();
for(String s : response){
    booleanList.add("ON".equalsIgnoreCase(s.trim()));
}

我认为最终的问题是您的输入列表没有确切的值 "ON""OFF",它们周围可能有空格,因此 s.trim().equals("ON")s.contains("ON") 可以解决这个问题。此外,您不需要if-else,因为您可以直接将布尔表达式的结果添加到您的布尔列表中。

【讨论】:

  • 有 JAVA 7 的解决方案吗?
  • 这只适用于 Java 8+ 或使用 StreamSupport
  • 它返回 [false,false]
  • @AmalSoltani 编辑,修剪输入以防它周围有空格。
【解决方案2】:

假设 API 返回如下内容:

    List<String> apiResponse = Arrays.asList("OFF", "ON", "ON", "OFF");

然后可以使用流式传输结果并将响应映射到布尔值。例如:

    List<Boolean> switches = apiResponse.stream().map(s -> s.equals("ON").collect(Collectors.toList());

【讨论】:

    【解决方案3】:

    无需转换列表。 你可以使用这样的功能

    public ArrayList<Boolean> convertToBooleanList(ArrayList<String> responseArrayList) {
            ArrayList<Boolean> convertedList = new ArrayList<Boolean>();
    
            for (String response : responseArrayList) {
                switch (response) {
                    case "ON":
                        convertedList.add(true);
                        break;
    
                    case "OFF":
                        convertedList.add(false);
                        break;
                }
            }
            return convertedList;
    }
    

    【讨论】:

    • 它返回一个空列表
    • @AmalSoltani 如果列表为空,则列表中的值不是“ON”或“OFF”而是其他值,例如'开'。
    • 如果输入既不是“ON”也不是“OFF”,那么它将被静默忽略,并且您的结果列表的长度将与您的输入列表不同。在默认情况下,我会抛出一个IllegalArgumentException。如果值与任何真实值匹配,则通用布尔解析返回 true,否则返回 false。因此,我可以看到 switch 样板的唯一好处是在不完全匹配时抛出异常。
    • 我用 for 循环完成了它:for(int i = 0 ; i
    • 我不想在我的答案中添加它,因为我不知道他是要抛出异常还是只是添加任何其他情况
    【解决方案4】:

    你可以这样做:

    List = { "true", "false" };
    final Boolean[] booleanList = Arrays.stream(booleanList)
             .map(Boolean::parseBoolean).toArray(Boolean[]::new);
    

    这应该可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多