【问题标题】:ArrayLists of various class types - generic method to find position of a key value in array各种类类型的 ArrayLists - 查找数组中键值位置的通用方法
【发布时间】:2020-12-10 10:03:26
【问题描述】:

我有一个带有多个输入表单和多个下拉菜单的 Android 应用。 对于这些表单,用户可以在提交记录之前多次进入和退出记录。 因此,如果他们在下拉菜单中选择了某些内容,退出记录,然后再次进入 - 他们希望看到他们的最后一个条目已经在下拉列表中预选。

这是驱动下拉列表的众多类类型之一的示例:

public class SART implements Serializable
{
    private String Code;
    private String Description;

    public String getCode() {return Code;}
    public void setCode(String Code) {this.Code = Code;}

    public String getDescription() {return Description;}
    public void setDescription(String Description) {this.Description = Description;}
}

所以我取一个已知值并在驱动下拉列表的数组列表中查找它的位置并选择 这条线在下拉。 这是我如何做的一个例子:

   int FindApplicationMethodPosition(ArrayList<SART> applicationMethods,String strExistingId)
    {
        int intSARTPosition = -1;

        if (strExistingId !=null)
        {
            for(int i = 0; i <applicationMethods.size(); i++){
                if(applicationMethods.get(i).getCode().equals(strExistingId))
                {
                    intSARTPosition = i;
                    break;
                }
            }
        }
        return intSARTPosition;
    }

我的代码中有大约 30 个不同的版本,我想尝试只调用一个通用版本。

    int FindPositionGeneric(Object array, String strExistingId)
    {
        int intRC = -1;
        intRC = IntStream.range(0, array.size())
                .filter(i -> array.get(i).getCode().equals(strExistingId))
                .findFirst()
                .orElse(-1);

        return intRC;
    }

当然,编译器根本不喜欢这样。 请问有什么建议吗?

【问题讨论】:

    标签: java android arraylist dropdown cursor-position


    【解决方案1】:

    当然编译器根本不喜欢这样。

    它不知道如何从array获取元素,也不知道如何从数组中的元素获取code

    传入List&lt;T&gt;Function&lt;T, String&gt; 以允许其提取代码:

    <T> int FindPositionGeneric(List<T> array, Function<T, String> codeFn, String strExistingId)
    {
        int intRC = -1;
        intRC = IntStream.range(0, array.size())
                .filter(i -> codeFn.apply(array.get(i)).equals(strExistingId))
                .findFirst()
                .orElse(-1);
    
        return intRC;
    }
    

    请注意,这对于非RandomAccess 列表(例如LinkedList)效率低下。另一种解决方案是基于ListIterator 的循环:

    ListIterator<T> it = array.listIterator();
    while (it.hasNext()) {
      int idx = it.nextIndex();
      String code = codeFn.apply(it.next());
      if (code.equals(strExistingId)) {
        return idx;
      }
    }
    return -1;
    

    【讨论】:

      【解决方案2】:

      如果类的30个版本都有相同的getCode(),那么就创建一个接口(设成MyInterface),让所有的类都实现这个接口。然后更新方法如下:

       int FindPositionGeneric(List<MyInterface> list, String strExistingId)
          {
      
              int intRC = IntStream.range(0, list.size())
                                   .filter(i -> list.get(i).getCode().equals(strExistingId))
                                   .findFirst()
                                   .orElse(-1);
      
              return intRC;
          }
      

      另外,既然你有orElse,不需要单独初始化intRC

      【讨论】:

      • 非常感谢您的建议。我需要几天时间来吸收这些概念。
      猜你喜欢
      • 2012-07-23
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 2014-09-19
      相关资源
      最近更新 更多