我有一个存储汽车的ArrayList(例如(。汽车的每个实例都有三个数据字段(品牌、型号和年份(。Make和Model都是String,year是Int值。我希望能够搜索ArrayList,并返回2014年生产的每辆车的索引位置(比如(。我可以使用一个简单的搜索来返回第一个索引位置,如下所示:
public static int searchYear(ArrayList<Cars> cars, int key)
{
int size = cars.size();
for (int i = 0; i < size; i++)
{
if (cars.get(i).getYear() == key)
return i;
}
return - 1;
}
其中key==2014(我正在查找的年份(。我如何让它返回所有带有该键的汽车的索引值,而不仅仅是它的第一个实例?
简单回答:您应该返回一个值数组,而不是单个int
。类似于此签名:
public static ArrayList<Integer> searchYear (ArrayList<Cars> cars, int key)
更多评论:
如果存在多个与该键匹配的实例,则将参数命名为key
会产生误导。密钥不是唯一的密钥,而是一个值。。。我会改为调用参数year
。
你的方法的签名应该是这样的:
public static int[] searchYear (Cars[] cars, int year)
当然,您应该在您的方法中实现int数组的创建,并添加与您的年份参数匹配的索引。
你可能会问自己,为什么我把ArrayList<Cars>
改成了Cars[]
。好吧,这是你正在创建的这个方法未来使用的灵活性问题。普通数组[]是比ArrayList
更常见的构造。事实上,我不会把ArrayList
放在我的方法签名中,除非我使用任何特定于ArrayList
的方法。
由于您使用.get(i(通过索引进行访问,因此此方法是在java.util.List
接口上定义的,因此List
参数是有意义的:
public static int[] searchYear (List<Cars> cars, int year)
我们可以讨论int[]
返回类型:另一个选项是Collection<Integer>
甚至Iterable<Integer>
。选择一个或另一个的理由与cars
参数相同:这完全取决于你想对方法返回的索引列表做什么。