【问题标题】:ArrayList<String> doesn't set minimum capacityArrayList<String> 没有设置最小容量
【发布时间】:2011-07-13 22:25:41
【问题描述】:
private static ArrayList<String> places(ArrayList<Road> roads) {
    ArrayList<String> places = new ArrayList<String>(10); // tried setting minimum capacity
    places.ensureCapacity(10); // tried setting minimum capacity

    for (int i = 0; i < roads.size(); i++) {
        String from = roads.get(i).getFrom();
        String to = roads.get(i).getTo();

        for (int j = 0; j < places.size(); j++) { // this is where things go wrong, it doesn't iterate because the "j < places.size()" condition isn't met
            if ((places.get(i).equals(from))==false) {
                places.add(from);
            }
            if ((places.get(i).equals(to))==false) {
                places.add(to);
            }
        }
    }

    return places;
}

不知道为什么,但是 places-ArrayList 没有设置初始容量,这导致我以后必须迭代时无法迭代位置(处理 j 变量的 for 循环)。

【问题讨论】:

  • 你遇到了什么错误 - 你怎么不能迭代?我怀疑你的实际问题是places.get(i) 正在返回一个null 值,你将无法在...上调用equals() 哦,大多数时候使用'not'运算符 - @987654325 @ - 用于代替 ==false
  • 是的,places.get(i) 可能会返回null,看看我能不能解决这个问题。我使用了非运算符,但改为==false,我可能会改回来,这可能是一个好习惯,但如果我使用==false,我发现更容易将我的大脑包裹在设计上。
  • 是的,除了 ==false 的评估结果为 true,这只是令人困惑。另外,请考虑切换到 Set 实现,因为这似乎是您试图产生的 - 或者查找 contains() 方法,它将处理您的 null 问题。
  • 我刚刚在那些 for 循环之前添加了一个 if,说明如果 ArrayList 为空,则应该添加一些内容。

标签: java string for-loop arraylist


【解决方案1】:

最小容量与大小不同。设置容量只是对列表的一个提示,它应该至少有这么多的存储空间以避免不必要的数组副本,但不会影响大小,所以即使你有 n 个元素的容量,size() 也可以更少,并且调用get(n-1) 可能会导致IndexOutOfBoundsException

要创建一个以null 填充的大小为 n 的列表,请尝试

List<String> myList = new ArrayList<String>(n);
for (int i = 0; i < n; ++i) { myList.add(null); }

【讨论】:

    【解决方案2】:

    容量属性只是为类提供了其内部缓冲区大小的大小。它不会向列表添加任何值(顺便说一句,会添加哪些值?)所以列表仍然是空的。

    容量的唯一作用是允许类避免在稍后的执行过程中调整其缓冲区的大小(以及相关的性能损失)。但这不是硬性限制。您可以像使用任何其他列表一样随意添加或更多元素。

    【讨论】:

      【解决方案3】:

      使用foreach

      for(Road road : roads)
      {
          String from = road.getFrom();
          String to = roads.getTo();
          for(Places place: places)
          {
              if(!place.equals(from)) places.add(from);
              if(!place.equals(to))   places.add(to);
          }
      }
      

      【讨论】:

      • doh,我更喜欢使用 fori 而不是 fore,但是好的.. 我会尝试一下,谢谢。
      • 虽然它确实是一种迭代内容的方式并且它可能“更好”,但它与问题无关。他问为什么他设置了容量后列表还是空的。
      • 不幸的是,尽管这是一个好主意,但这实际上并不能帮助他们解决问题。
      【解决方案4】:

      ArrayList.ensureCapacity() 分配足够的内存来容纳给定数量的条目。它实际上并没有在ArrayList 中添加任何内容。

      ArrayList.size() 计算实际条目的数量,而不是当前容量。

      在调用 places.add() 以实际将任何内容放入 places 之前,您的循环会查看 places.size()。在循环开始时调用 places.size() 时,它会正确返回 0,因为此时您尚未将任何内容放入 places

      还有一点。您有一个名为places 的方法,在该方法中还有一个也称为places 的局部变量。这是混乱的秘诀。您应该为其中一个使用不同的名称。

      【讨论】:

      • 将变量改为placesArr
      猜你喜欢
      • 2012-07-13
      • 2012-10-25
      • 1970-01-01
      • 2010-10-14
      • 2019-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多