【问题标题】:Error: cannot find symbol- variable. Refering to ".length"错误:找不到符号变量。参考“.length”
【发布时间】:2016-01-10 02:46:31
【问题描述】:

我正在尝试将 storyList 数组中的每个“ADJEKTIVER”字符串转换为我的 adjectivesList 数组中的随机字符串。当我试图编译时,我只得到错误:找不到符号变量。以 .length 作为变量/属性。找了好久的解决办法

    ArrayList<String> storyList = new ArrayList<String>();
    storyList = reader.getWordsInFile(storyFilename);

    ArrayList<String> adjectivesList = new ArrayList<String>();
    adjectivesList = reader.getWordsInFile(adjectivesFilename);

    for (int index =0; index < storyList.length; index++)
    {
        storyList[index] = storyList[index].replace("ADJEKTIV", adjectivesList[random.nextInt(adjectivesList)]);
    }

    writer.write(adjectivesList, outputFilename);

【问题讨论】:

  • Listssize()。数组有 length。字符串有 length()。请不要问我为什么它们不一致:(

标签: java arrays for-loop replace


【解决方案1】:

数组有一个名为length的公共final int属性,它保存数组中元素的数量,数组不能改变它们在Java中的元素数量。 这让我想到 ArrayList 有一个可以改变元素数量的集合是有用的,但这不是魔法(我希望有人告诉我这个)。它有一个 E[] 类型的数组,我将这个内部数组称为 arr。 当您将元素推送到 ArrarList 时

public boolean add(E e) {
    E[] temp = new E[this.arr.length];
    for (int i = 0; i < this.arr.length; i++)
        temp[i] = this.arr[i];

    this.arr = new E[this.arr.length + 1];

    for (int i = 0; i < this.arr.length; i++)
        this.arr[i] = (i == temp.length ? e : temp[i]);

    temp = null; // free temp or let it fall out of scope
    return true;
}

// Removing is easy too

public E remove(int index) { // I'm just doing the first of the overloaded methods, in api
    E returnValue = this.arr[index];
    E[] temp = new E[this.arr.length - 1];
    for (int i = 0; i < this.arr.length; i++)
        if (i != index) temp[i] = this.arr[i];

    this.arr = new E[this.arr.length - 1];

    for (int i = 0; i < this.arr.length; i++)
        this.arr[i] = (i == temp.length ? e : temp[i]);

    temp = null; // free temp or let it fall out of scope
    return returnValue;
}

能够更改长度会强制在 Java 中通过在这种情况下称为 size 的方法以动态方式访问它。

public int size() {
    return this.arr.length;
}

Java 既作为标准也作为实现存在,前者可能被实现为字符串是可变的,因此使 String 具有长度方法使代码在标准实现之间更加兼容,因为实现(不一定是 Java 的实现) ) 已知会出现偏差,因此使它们更兼容对 Java 开发人员来说是有意义的。

至于为什么 ArrayList 使用 size() 作为方法名,而 String 使用 length(),而 Array 使用 length,我不知道,虽然在我看来(提前警告)访问长度并不是不合理的以他们的方式实现,Java 开发人员感到被锁定,因为更改规范也需要更改相关代码。

public int length() {
    return this.arr.length;
}

显示的所有代码仅用于演示目的,按原样提供,不提供任何形式的保证。

【讨论】:

    【解决方案2】:

    使用storyList.size() 方法代替storyList.length

    for (int index =0; index < storyList.size(); index++)
    

    【讨论】:

    • @Mr.Robot - 不。这回答了 OP 的问题
    【解决方案3】:

    ArralistList 没有任何名为“length”的属性。改用size() 方法

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      相关资源
      最近更新 更多