如何从ArrayList中获取指定元素?附自定义Parcelable类型Coin类代码
如何从ArrayList中获取指定元素并补全Parcelable实现的Coin类?
嘿,我来帮你搞定这两个问题,这都是Android开发里常用的操作,咱们一步步来:
一、从ArrayList中获取指定元素的三种常用方法
1. 通过索引直接获取
如果已经知道目标元素在ArrayList中的位置(索引从0开始),直接用get(int index)方法就可以拿到,不过要注意别越界,否则会抛出IndexOutOfBoundsException异常。举个例子:
// 先初始化并填充你的Coin列表 ArrayList<Coin> coinList = new ArrayList<>(); coinList.add(new Coin("Bitcoin", "$30000", "+2.5%")); coinList.add(new Coin("Ethereum", "$1800", "-1.2%")); // 获取索引为1的元素(也就是第二个元素Ethereum) Coin targetCoin = coinList.get(1);
2. 遍历列表查找匹配元素
如果不知道索引,想根据Coin的属性(比如name)来查找,就可以用增强for循环遍历列表,匹配到目标元素就返回:
// 根据名称查找Coin的方法 private Coin findCoinByName(String targetName, ArrayList<Coin> coinList) { for (Coin coin : coinList) { // 这里要注意空指针,最好先判断coin.getName()不为null再比较 if (targetName != null && targetName.equals(coin.getName())) { return coin; } } // 没找到匹配的元素就返回null return null; }
3. Java 8+ Stream方式(更简洁)
如果你的项目用了Java 8及以上,用Stream API来查找会更优雅,还能避免空指针问题:
// 查找名称为Bitcoin的Coin Optional<Coin> optionalCoin = coinList.stream() .filter(coin -> "Bitcoin".equals(coin.getName())) .findFirst(); // 如果存在就获取元素,否则返回null Coin targetCoin = optionalCoin.orElse(null);
二、补全你的Coin类的Parcelable实现
你提供的Coin类已经有了Parcelable的雏形,我帮你补全剩下的代码,并且加上必要的说明:
package com.example.vartotojas.heycrypto; import android.os.Parcel; import android.os.Parcelable; public class Coin implements Parcelable{ private String name; private String price; private String change; // 常规构造方法,用于创建Coin对象 public Coin(String name, String price, String change) { this.name = name; this.price = price; this.change = change; } // 从Parcel中读取数据的构造方法,顺序要和writeToParcel一致 protected Coin(Parcel in) { name = in.readString(); price = in.readString(); // 补全你没写完的price读取 change = in.readString(); } // Parcelable要求的方法,一般返回0即可(只有当包含特殊对象时才需要修改) @Override public int describeContents() { return 0; } // 将对象数据写入Parcel,顺序必须和读取时完全对应 @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeString(price); dest.writeString(change); } // 必须的CREATOR常量,系统用它来反序列化Parcel为Coin对象 public static final Creator<Coin> CREATOR = new Creator<Coin>() { @Override public Coin createFromParcel(Parcel in) { return new Coin(in); } @Override public Coin[] newArray(int size) { return new Coin[size]; } }; // 添加getter方法,方便外部访问私有属性(查找、展示数据都需要) public String getName() { return name; } public String getPrice() { return price; } public String getChange() { return change; } }
几个关键注意点:
- 读写顺序必须一致:
writeToParcel里写入的顺序,要和Coin(Parcel in)里读取的顺序完全相同,不然会导致属性值错乱; - CREATOR必须实现:这是Parcelable接口强制要求的,没有它系统无法完成对象的反序列化;
- 添加getter方法:因为你的属性是private的,外部要访问的话必须通过getter,不管是查找元素还是展示数据都离不开它。
内容的提问来源于stack exchange,提问作者Kazj
相关产品推荐
相关产品推荐

