如何使用自定义模型在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

【问题讨论】:

这是否意味着您将只有具有 tagAction 的 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&lt;Integer&gt;

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 类对象上调用。这肯定会通过相等性检查。

作为解决方案,如果 tagtitle 匹配,则覆盖 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 的列表索引

如何使用自定义列表视图在edittext过滤器中获取空间?可以使用简单的适配器吗?

如何获取自定义 Oracle 函数参数定义