如何使用自定义模型在java中获取列表索引
Posted
技术标签:
【中文标题】如何使用自定义模型在java中获取列表索引【英文标题】:how to get list index in java with custom Model 【发布时间】:2021-11-09 07:04:30 【问题描述】:我有一个类似这样的模型类:
public class Model
String title, tag;
public Model()
public Model(String title, String tag)
this.title = title;
this.tag = tag;
public String getTitle()
return title;
public void setTitle(String title)
this.title = title;
public String getTag()
return tag;
public void setTag(String tag)
this.tag = tag;
所以我有 ArrayList<Model> arr;
根据我的模型类
所以,例如,我想获取标签的Index
-
//Let Suppose I have ArrayList Like this.
arr.add(new Model("SKYFALL","Action"));
arr.add(new Model("CASINO ROYALE","Thriller"));
//and so on.........
例如,我希望其索引具有 Action
标签。
我做了这样的事情 -
int index = arr.indexOf("Action");
但它的索引总是-1
【问题讨论】:
这是否意味着您将只有具有tag
的 Action
的 Object ?如果不是,您最好使用Map
吗?
【参考方案1】:
获取包含提供标签的对象的索引。可以有多个Model
具有相同的可用标签。
public static void main(String[] args)
ArrayList<Model> arr =new ArrayList<>();
arr.add(new Model("SKYFALL","Action"));
arr.add(new Model("CASINO ROYALE","Adventure"));
arr.add(new Model("CASINO ROYALE","Thriller"));
arr.add(new Model("CASINO ROYALE","Adventure"));
List<Integer> indexesByTag = getIndexesByTag(arr, "Adventure");;
System.out.println(indexesByTag);
// [1, 3]
获取提供标签的对象索引的方法需要返回List<Integer>
。
public static List<Integer> getIndexesByTag(ArrayList<Model> arr, String action)
IntStream intStream = IntStream.range(0, arr.size());
return intStream.boxed()
.map(index ->
if(arr.get(index).getTag().equals(action))
return index;
return -1;
)
.filter(index -> index!=-1)
.collect(Collectors.toList());
没有流的其他方式:
public static List<Integer> getIndexesByTag(ArrayList<Model> arr, String action)
List<Integer> indexes = new ArrayList<>();
for (int index = 0; index < arr.size(); index++)
if(arr.get(index).getTag().equals(action))
indexes.add(index);
return indexes;
【讨论】:
是的!你的答案也很好,但它需要 API 级别 24,我的 API 是 19。所以它在 API 24 上工作,但在 19 中我能做什么? @JamesBond。更新了答案。 你的回答也不错【参考方案2】:您发现索引错误,您的数组列表是对象数组(模型类),而您使用字符串查找索引。
需要提供对象才能找到索引
Model actionModel = new Model("SKYFALL","Action")
arr.add(actionModel);
arr.add(new Model("CASINO ROYALE","Thriller"));
查找索引
int index = arr.indexOf(actionModel);
编辑: 您可以在数组列表上运行循环以查找项目的索引
for (int i = 0; i < arr.size; i++)
if (arr.get(i).getTag().eqauls("Action"))
index = i;
break;
【讨论】:
我有很多列表,而不仅仅是一个带有Action
标签的列表,所以请给出适用于我所有列表的答案
你可以循环查找项目,我已经更新了代码
在index = i;
之后你应该break
是的,对不起,我的错误,谢谢@ScaryWombat
@NitishChaudhary 你的回答也不错【参考方案3】:
如果您检查 java 库中的 indexOf
方法代码(内部调用 indexOfRange
方法),它会通过对对象进行 equals
方法调用来返回索引。
int indexOfRange(Object o, int start, int end)
Object[] es = elementData;
if (o == null)
for (int i = start; i < end; i++)
if (es[i] == null)
return i;
else
for (int i = start; i < end; i++)
if (o.equals(es[i]))
return i;
return -1;
在您的代码中,equals
将在带有“Action”字符串的 Model
类对象上调用。这肯定会通过相等性检查。
作为解决方案,如果 tag
或 title
匹配,则覆盖 equals 方法以返回 true。但我会说这不是一个好的解决方案,因为equals
方法应该遵循一些约定。
因此,在此处使用Streams
API 也是正确的。
arr.add(new Model("SKYFALL","Action"));
arr.add(new Model("CASINO ROYALE","Thriller"));
String toMatch = "Action";
OptionalInt indexOpt = IntStream.range(0, arr.size())
.filter(i -> toMatch.equals(arr.get(i).tag))
.findFirst();
System.out.println(indexOpt.orElse(-1)); // 0 Index
已编辑: 如果您使用的是旧版本的 Java(Java 8 之前),您可以使用普通的 for 循环,如下所示:
int matchedIndex = -1;
for(int i = 0; i < arr.size() ; i++)
if(arr.get(i).getTag().equals(toMatch))
matchedIndex = i;
break;
所以这里如果matchedIndex
迭代后的值为-1,这意味着没有匹配。否则你会得到匹配的索引。
【讨论】:
是的!很好的答案,但Streams
需要 API 级别 24,而我的是 API 级别 19
so 我能做什么,也支持 19 api 级别
对于 API 级别 19,您可以使用普通的 for 循环。我已经更新了我的答案
如果找不到System.out.println(indexOpt.getAsInt());
的值是多少?
@GauravJeswani 你的回答也不错以上是关于如何使用自定义模型在java中获取列表索引的主要内容,如果未能解决你的问题,请参考以下文章
C# - 如何在不使用索引器的情况下获取自定义集合的第一项?
如何使用自定义 ConstraintValidator 将 ConstraintViolations 添加到索引 i 处的列表元素
如何使用自定义模型类按部分按字母顺序对 tableView 中的数据进行排序?
如何从 Listview.builder 中获取模型类 Flutter 的列表索引