当前位置: 首页 > 知识库问答 >
问题:

如何在java中更改ArrayList元素的值

公羊宗清
2023-03-14

请帮助我下面的代码,我得到相同的输出,即使改变值

import java.util.*;

class Test {
    public static void main(String[] args) {
        ArrayList<Integer> a = new ArrayList<Integer>();

       // added 0-9 to ArrayList        
          for(int i=0;i<9;i++)
            a.add(new Integer(i));

        // initialize the Iterator
        Iterator<Integer> i = a.iterator();

        // changed the value of first element in List
        if(i.hasNext()) {
            Integer x = i.next();
            x = Integer.valueOf(9);
        }

        // initialized the iterator again and print all the elements
        i = a.iterator();
        while(i.hasNext())
            System.out.print(i.next());
    }
}    

//Output : 012345678

值9未更新。

共有3个答案

翟聪
2023-03-14

你说你要改变第一个元素的值;

x = Integer.valueOf(9);

您将x更改为指向一个全新的整数,但不再使用它。你不会以任何方式改变收藏。

由于您正在使用ArrayList,如果您想要一个允许您更改元素的迭代器,您可以使用ListIterator,这是需要更改的代码片段;

//初始化迭代器
listIterator

//如果(i.hasNext()){

//新建迭代器,并打印所有元素
iterator iter=a.iterator()
while(iter.hasNext())

可悲的是,同样的情况不能扩展到其他集合,如Set

万高洁
2023-03-14

使用set方法将旧值替换为新值。

list.set( 2, "New" );
尉迟越
2023-03-14

列表维护的是对存储在列表中的原始值的对象引用。因此,当您执行这一行时:

Integer x = i.next();

x和列表都存储了对同一对象的引用。但是,当您执行:

x = Integer.valueOf(9);

列表中没有任何变化,但是x现在正在存储对不同对象的引用。列表没有变化。您需要使用一些列表操作方法,例如

list.set(index, Integer.valueof(9))

注意:正如其他人所建议的,这与intger的不可变性无关。这只是基本Java对象引用行为。

这里有一个完整的例子,以帮助解释这一点。请注意,这使用了ListIterator类,它支持在迭代过程中删除/设置项:

import java.util.*;

public class ListExample {

  public static void main(String[] args) {

    List<Foo> fooList = new ArrayList<Foo>();
    for (int i = 0; i < 9; i++)
      fooList.add(new Foo(i, i));

    // Standard iterator sufficient for altering elements
    Iterator<Foo> iterator = fooList.iterator();

    if (iterator.hasNext()) {
      Foo foo = iterator.next();
      foo.x = 99;
      foo.y = 42;
    }

    printList(fooList);    

    // List iterator needed for replacing elements
    ListIterator<Foo> listIterator = fooList.listIterator();

    if (listIterator.hasNext()) {
      // Need to call next, before set.
      listIterator.next();
      // Replace item returned from next()
      listIterator.set(new Foo(99,99));
    }

    printList(fooList);
  }

  private static void printList(List<?> list) {
    Iterator<?> iterator = list.iterator();
    while (iterator.hasNext()) {
      System.out.print(iterator.next());
    }
    System.out.println();
  }

  private static class Foo {
    int x;
    int y;

    Foo(int x, int y) {
      this.x = x;
      this.y = y;
    }

    @Override
    public String toString() {
      return String.format("[%d, %d]", x, y);
    }
  }
}

这将打印:

[99, 42][1, 1][2, 2][3, 3][4, 4][5, 5][6, 6][7, 7][8, 8]
[99, 99][1, 1][2, 2][3, 3][4, 4][5, 5][6, 6][7, 7][8, 8]
 类似资料:
  • 问题内容: 我有10 秒之一。如何用另一个值更新索引? 问题答案: 让是和新的,那么就这样做: 可以在此处的Java api参考中找到。

  • 问题内容: 我对Java编程还是很陌生,我正在尝试使用以下代码来更新an的现有值: 我想打印而不是打印,但得到的结果仍然是。我要打印。我怎样才能做到这一点?谢谢。 问题答案: 使用该方法将旧值替换为新值。

  • 问题内容: 我想动态更新元素的文本: 我是jQuery的新手,因此对我来说,这项任务似乎非常具有挑战性。有人可以指出我要使用的功能/选择器吗? 如果可能的话,我想在不为需要更改的文本添加新容器的情况下执行此操作。 问题答案: 在Javascript中,该属性为您提供元素的所有子节点,包括文本节点。 因此,如果您知道要更改的文本始终是元素中的第一件事,那么请给出以下HTML: 您可以这样做: 当然,

  • 问题内容: 如果我有跨度,请说: 如何使用JavaScript将“ hereismytext”更改为“ newtext”? 问题答案: 对于现代浏览器,您应该使用: 尽管较旧的浏览器可能不知道,但不建议使用,因为当用户输入新文本时,它会引入XSS漏洞(有关更多详细讨论,请参见下面的其他答案):

  • 问题内容: 我有一个键为数字值的形式的关联数组,但是它不是顺序的数字值。密钥实际上是一个ID号,而值是一个计数。这在大多数情况下都很好,但是我想要一个函数,该函数获取数组的可读名称并将其用于键,而不更改值。 我没有看到执行此操作的函数,但是我假设我需要提供旧键和新键(我都拥有)并转换数组。有有效的方法吗? 问题答案:

  • 此外,我尝试以以下方式使用对象标记: 但是,同样,如果我用CSS指令或将类应用到对象标记,则不会发生任何变化。有什么想法可以实现我想要的吗?