有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

各种类类型的java ArrayList是查找数组中键值位置的通用方法

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

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


共 (2) 个答案

  1. # 1 楼答案

    But of course the compiler does not like this at all.

    它不知道如何从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;
    
  2. # 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