修改ArrayList中的值

时间:2014-12-05 08:53:14

标签: java list arraylist

我有这段代码:

List<Banner> bannerLists = ...; // Get the list
for (Banner bannerList : bannerLists) {
    bannerList.getLocation().setLocationName("1 - " 
                     + bannerList.getLocation().getLocationName());

    log.info("LOCATION " + bannerList.getId() + " : " 
                     + bannerList.getLocation().getLocationName());
}

假设每个locationName具有相同的值:LOCATIONA,但id彼此不同。 日志导致类似:

  • 位置IDA:1 - LOCATIONA
  • 位置IDB:1 - 1 - LOCATIONA
  • LOCATION IDC:1 - 1 - 1 - LOCATIONA

这就像修改过的字段在下一次重复时仍会被调用。

这是结构(我省略了不必要的细节):

Banner.java

...
private Location location;
...

Location.java

...
private String locationName;
...

怎么了?我尝试使用for(int i = 0; i ...,但同样。

修改

for (Banner bannerList : bannerLists) {
    Location location = banner.getLocation();
    location.setLocationName("1 - " + location.getPageName());
    bannerList.setLocation(location);

    log.info("LOCATION " + bannerList.getId() + " : " 
                     + bannerList.getLocation().getLocationName());
}

5 个答案:

答案 0 :(得分:4)

当你得到它时,你试图递归设置locationName。我想你想要它的位置。您可以将引用Location保存到变量中。总之,像

List<Banner> bannerLists = ...; // Get the list
int pos = 0;
for (Banner banner : bannerLists) {
  Location location = banner.getLocation();
  String locName = Integer.toString(pos++);
  location.setLocationName(locName);
  log.info("LOCATION " + bannerList.getId() + " : " + locName);
}

List<Banner> bannerLists = ...; // Get the list
for (int pos = 0, len = bannerLists.size(); pos < len; pos++) {
  Banner banner = bannerLists.get(pos);
  Location location = banner.getLocation();
  String locName = Integer.toString(pos);
  location.setLocationName(locName);
  log.info("LOCATION " + bannerList.getId() + " : " + locName);
}

答案 1 :(得分:2)

您正在循环的每次迭代中更改位置名称,在开头添加“1 - ”。

bannerList.getLocation().setLocationName("1 - " 
                     + bannerList.getLocation().getLocationName());

因此,如果列表中的所有横幅共享相同的位置,则在每次迭代中您都会看到不同的名称。

如果您希望为所有横幅打印相同的位置名称,请不要更新循环内的位置名称。

答案 2 :(得分:1)

我认为这种行为的原因是所有横幅实际上都指向同一个Location对象,而不仅仅是一个具有相同名称的对象。

这会考虑您已更新的所有地点:

ArrayList<Location> prev = new ArrayList<Location>();
for (Banner bannerList : bannerLists) {
    Location location = bannerList.getLocation();
    if (!prev.contains(location)) {
        location.setLocationName("1 - " + location.getLocationName());
        prev.add(location);
    }

    log.info("LOCATION " + bannerList.getId() + " : " 
                     + bannerList.getLocation().getLocationName());
}

答案 3 :(得分:0)

用变量替换第一个参数,就像这样发生,因为你只是通过循环添加一个带有其他字符串的字符串,

类似的东西:

for i=0; i<3; i++
    print("1 + ")

结果

1 +
1 + 1
1 + 1 + 1

修改为:

for i=0; i<3; i++
        print(i + "some args")

你的代码应该是这样的,

 counter = 0;
 for (Banner bannerList : bannerLists) {
      counter += 1;
      bannerList.getLocation().setLocationName(counter + " - " + banner.getLocation().getLocationName());
      log.info("LOCATION : " + bannerList.getLocation().getLocationName());
 }

变量counter将通过循环更新,并更新您的ID

答案 4 :(得分:0)

在我的部分它运作良好我认为这是一个问题横幅或位置类。

看看这个。

public class Test1 {

    public static  void main(String[] args){

        List<Banner> bannerList = generateBanners();

        for(Banner banner : bannerList){
            banner.getLocation().setLocationName("1 - " + banner.getLocation().getLocationName());
            System.out.println("ID : "+banner.getLocation().getLocationId() +"   Value : "+banner.getLocation().getLocationName());
        }

    }


    public static List<Banner> generateBanners(){
        List<Banner> banners = new ArrayList<Banner>();

        Location location = new Location(1,"LOCATIONA");
        Banner banner = new Banner(location);
        banners.add(banner);

        location = new Location(2,"LOCATIONA");
        banner = new Banner(location);
        banners.add(banner);

        location = new Location(3,"LOCATIONA");
        banner = new Banner(location);
        banners.add(banner);

        return banners;
    }

}

这是我的Banner类

public class Banner{

    private Location location;

    public Banner(){}

    public Banner(Location location){
        this.location = location;
    }

    public Location getLocation() {
        return location;
    }

    public void setLocation(Location location) {
        this.location = location;
    }

}

我的位置课程。

public class Location{

    private int locationId;
    private String locationName;

    public Location(){}

    public Location(int locationId, String locationName){
        this.locationName = locationName;
        this.locationId = locationId;
    }

    public int getLocationId() {
        return locationId;
    }

    public void setLocationId(int locationId) {
        this.locationId = locationId;
    }

    public String getLocationName() {
        return locationName;
    }

    public void setLocationName(String locationName) {
        this.locationName = locationName;
    }
}

输出:

ID : 1   Value : 1 - LOCATIONA
ID : 2   Value : 1 - LOCATIONA
ID : 3   Value : 1 - LOCATIONA

如果错误的话,请纠正我。