各种类类型的ArrayList-查找数组中键值位置的泛型方法

eblbsuwk  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(285)

我有一个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;
    }

当然,编译器一点也不喜欢这样。有什么建议吗?

nzrxty8p

nzrxty8p1#

当然,编译器一点也不喜欢这样。
它不知道如何从 array ,也不知道如何获得 code 从数组中的元素。
通过 List<T> ,和 Function<T, String> 要允许它提取代码:

<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;
yxyvkwin

yxyvkwin2#

如果类的所有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 分开。

相关问题