【问题标题】:Workaround for declaring array in an if condition在 if 条件下声明数组的解决方法
【发布时间】:2014-07-11 09:55:51
【问题描述】:

这部分代码有问题,我希望能够声明一个数组,其大小应该是字符串中相应的拆分数。 或者我是否需要计算字符串中逗号的数量并相应地分配大小,或者是否有更好的解决方案。

    String MapPath2[];
    if(type.equals("comparative"))
        MapPath2[]=args[1].split(",");

我最近没有机会用 Java 编写代码。如果这是一个愚蠢的问题,请饶恕我,并指导我作为菜鸟。感谢您的帮助。

【问题讨论】:

  • 这不是有效的 Java。
  • 除了删除作业中的[],这应该没问题。 String.split 将返回数组 - 你不需要预先分配它。
  • 不要这样命名变量。叫它mapPath2
  • 我知道。因此,如果可能的话,我需要一个解决方法,这比计算逗号的数量要好。谢谢 Tichodroma
  • 你的意思是像这样 Jon skeet String mappath2; if(type.equals("comparative")) mappath2=args[1].split(",");

标签: java arrays if-statement split declaration


【解决方案1】:

大小不需要声明,去掉多余的[]就可以了:

String MapPath2[];
if(type.equals("comparative"))
    MapPath2=args[1].split(",");

返回给您的数组split 具有适当的大小。如果您需要知道结果大小,请使用MapPath2.length(在分配之后)。

您可能还想在else 中做一些事情,以便MapPath2 具有确定的价值:

String MapPath2[];
if(type.equals("comparative"))
    MapPath2=args[1].split(",");
else
    MapPath2=null;

或更简洁:

String MapPath2[];
MapPath2 = type.equals("comparative") ? args[1].split(",") : null;

(而不是那里的nulls,if 有一个空数组是后续逻辑的首选,因为有时很方便,将null 替换为上面和下面的new String[0]。其他时候,将null 作为“无数据”标志更方便。)


旁注:Java 世界中有一些绝大多数通用的代码样式约定,最好建议您在代码中使用它们:

  1. 变量名应以小写字母开头,以免与类名混淆。

  2. [] 应该使用类型名称而不是变量名称。

  3. 始终使用{},即使ifelse 的正文只有一行。

  4. 在运算符和关键字周围放置空格以方便阅读。

应用那些:

String[] mapPath2;
if (type.equals("comparative")) {
    mapPath2 = args[1].split(",");
}
else {
    mapPath2 = null;
}

很多人也把else}放在同一行,所以:

String[] mapPath2;
if (type.equals("comparative")) {
    mapPath2 = args[1].split(",");
} else {
    mapPath2 = null;
}

或者更简洁地说:

String[] mapPath2;
mapPath2 = type.equals("comparative") ? args[1].split(",") : null;

【讨论】:

  • 最好使用更传统的名称和方括号放置:)
  • @JonSkeet:确实。 :-) 我在最后添加了一条说明。
  • 感谢@T.J.Crowder。再过 9 分钟,我无法接受你的回答。
【解决方案2】:

如果您不知道需要多大尺寸,可以使用List 代替Array

然后就可以使用了

    List<String> list = new ArrayList<>();
    if(type.equals("comparative")){
       Collections.addAll(list, args[1].split(","));
    }

【讨论】:

  • “如果你不知道它需要多大的尺寸,你可以使用List而不是Array。”可以,但是即使您不知道大小,也可以使用数组,因为split 会为您处理。在上面,您仍在创建一个数组(实际上,您正在创建两个,其中一个是临时的 - 并且很可能创建三个甚至更多,因为第一个在addAll 期间可能需要至少一次重新分配,并且可能不止一个)。
猜你喜欢
  • 2013-01-18
  • 2021-04-17
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多