Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从列表中存储的对象获取特定字段值的列表?_Java_Collections - Fatal编程技术网

Java 如何从列表中存储的对象获取特定字段值的列表?

Java 如何从列表中存储的对象获取特定字段值的列表?,java,collections,Java,Collections,假设我有一个对象列表,其中有两个字段field1和field2,都是字符串类型 如果可能的话,我如何获得一个包含所有字段1值的列表而不必迭代该列表?不,您不能。您必须遍历整个列表,并从每个对象获取每个“field1”值。尝试以下操作: List<Entity> entities = getEntities(); List<Integer> listIntegerEntities = Lambda.extract(entities, Lambda.on(Entity.cla

假设我有一个对象列表,其中有两个字段
field1
field2
,都是字符串类型


如果可能的话,我如何获得一个包含所有
字段1
值的列表而不必迭代该列表?

不,您不能。您必须遍历整个列表,并从每个对象获取每个“field1”值。

尝试以下操作:

List<Entity> entities = getEntities();
List<Integer> listIntegerEntities = Lambda.extract(entities, Lambda.on(Entity.class).getFielf1());
List entities=getEntities();
List listIntegerenties=Lambda.extract(entities,Lambda.on(Entity.class).getFielf1());

LambdaJ允许在没有显式循环的情况下访问集合,因此您可以让LambdaJ自己迭代列表,而不是使用更多的代码行。

对象是指向内存地址的引用。然后,该对象的字段是指向其他内存地址的其他引用。 因此,对象列表就是引用列表。因此,列表不可能直接访问对象字段(引用提供的引用)。简而言之,答案是否定的


注意:不管怎样,你会发现一个API做了你想要的,它仍然在内部循环。

java作为一种语言或JDK库都没有做你想要的。您可以使用或等待预期包含lambda表达式的Java 8。

也许您可以通过以下方式创建哈希映射:

HashMap<String, ArrayList<Object>> map;
import java.util.stream.Collectors;

List<String> field1List = entities.stream().map(YourEntity::getField1).collect(Collectors.toList());
HashMap;
关键是场地。
这样做,当您要求HashMap检索与所需字段对应的对象时,map将返回一个ArrayList,其中包含具有该字段的所有元素。

不进行迭代是不可能的。您可以以某种方式减少迭代,但这是必须的。

取决于。。。 。。。您的问题是否涉及
避免重复集合

  • 在呼叫点易于实施方面
  • 在算法复杂性方面
具体来说,你的意思是:

  • 您不想自己键入迭代构造(只需使用一个方便的库)
  • 或者你真的想要一个在O(1)中自动返回元素的东西,而不需要处理它们(并且拥有完美的访问权限)
有关解决方案和选项,请参见下文


使用便利图书馆 如果它是第一个,那么看看Google Guava、LambdaJ、FunctionalJava或其他实现基本函数构造的库,它们将允许您在几个表达性调用中实现您想要的功能。但请记住,它们会按照tin上的说明进行操作:它们会过滤、收集或转换一个集合,并通过其元素进行迭代

例如:

  • :

    Set strings=buildSetStrings();
    收集过滤器字符串=
    Collections2.filter(字符串、谓词.containsPattern(^J));
    
  • :

    Array a=Array(97,44,67,3,22,90,1,77,98,1078,6,64,6,79,42);
    阵列b=a.滤波器(偶数);
    
  • :

    List biggerThan3=filter(大于(3),asList(1,2,3,4,5));
    

完全访问 如果是第二个,这是不可能的,除了如果您从一开始就构建了所有内容,以便您的对象应该由自定义集合类管理,该类将根据插入时的字段值对对象进行索引

它会将它们保存在按上述值索引的存储桶中,以便您随时可以将它们作为列表或按需设置来检索


正如dounyy回答下面的评论中提到的,设计这样一个自定义集合可能会对它将接受的元素的API产生影响(很可能是通过定义用于元素类型的超级接口),或者需要相当复杂的实现来动态解析成员(很可能是通过使用反射),如果您希望此集合是通用的。

在不同的列表中添加记录的值,并使用一个或两个迭代器简单地打印 单独的值如下所示:

rs=st.executeQuery("select * from stu");
List data=new ArrayList();
List data1=new ArrayList();
while(rs.next())
{
   data.add(rs.getString(1));
   data1.add(rs.getString(2));
}
Iterator it=data.iterator();
Iterator it1=data1.iterator();
while(it1.hasNext())
{
   System.out.println(" "+it.next()+"  "+it1.next());
}
是的!!这是可能的。 但是你必须做一些不正当的工作

  • 使用必需的变量创建一个内部类。 这里我将使用两个变量(TNAME和TABTYPE)

  • 创建上面创建的内部类的列表,不要忘记封装它

    private List<storeTables> objlist= new ArrayList<storeTables>();
    
  • 创建一个数据模型并将列表推送到该数据模型

    private DataModel selectableItems= new ListDataModel(objlist);
    
  • 将扭曲的数据获取到另一个列表

    List<storeTables> items= (List<storeTables>)selectableItems.getWrappedData();
    
  • 多田!!!!它将只打印tablename,而不打印tabtype;) 相信在java中没有什么是不可能的
    任何疑问

    这是一个古老的问题,但我在寻找类似的解决方案时发现了它

    您可以实现
    列表
    接口,而无需创建充实的
    ArrayList
    ,因此不会迭代父对象

    final List<Entity> entities = getEntities()
    final List<String> field1 = new AbstractList() {
        public String get(int index) {
            return entities.get(index).getField1();
        }
        public int size() {
            return entities.size();
        }
    }
    
    final List entities=getEntities()
    最终列表字段1=新的抽象列表(){
    公共字符串get(int索引){
    返回entities.get(index.getField1();
    }
    公共整数大小(){
    返回实体的大小();
    }
    }
    
    这将为您提供一个列表,而无需迭代父对象

    final List<Entity> entities = getEntities()
    final List<String> field1 = new AbstractList() {
        public String get(int index) {
            return entities.get(index).getField1();
        }
        public int size() {
            return entities.size();
        }
    }
    

    随机访问派生的
    列表
    与随机访问基础
    列表
    一样昂贵;如果您使用的是不提供快速随机访问的
    列表
    实现,那么您可能需要跳过一些障碍(即实现更多的
    列表
    方法)。但这应该适用于99%需要轻型适配器的情况。

    幸运的是,您可以使用

    假设您有一个名为“您的实体”的实体

    public class YourEntity {
    
        private String field1;
        private String field2;
    
        public YourEntity(String field1, String field2) {
            this.field1 = field1;
            this.field2 = field2;
        }
    
        public void setField1(String field1) {
            this.field1 = field1;
        }
    
        public void setField2(String field2) {
            this.field2 = field2;
        }
    
        public String getField1() {
            return field1;
        }
    
        public String getField2() {
            return field2;
        }
    }
    
    使用以下方法声明您的实体列表:

    List<YourEntity> entities = Arrays.asList(new YourEntity("text1", "text2"), new YourEntity("text3", "text4"));
    
    输出

    text1
    text3
    

    让对象属于以下类

    public class Bike {
    
        String bikeModel;
        Int price;
    }
    
    现在有一个名为“泰自行车列表”的自行车列表
    public class YourEntity {
    
        private String field1;
        private String field2;
    
        public YourEntity(String field1, String field2) {
            this.field1 = field1;
            this.field2 = field2;
        }
    
        public void setField1(String field1) {
            this.field1 = field1;
        }
    
        public void setField2(String field2) {
            this.field2 = field2;
        }
    
        public String getField1() {
            return field1;
        }
    
        public String getField2() {
            return field2;
        }
    }
    
    List<YourEntity> entities = Arrays.asList(new YourEntity("text1", "text2"), new YourEntity("text3", "text4"));
    
    import java.util.stream.Collectors;
    
    List<String> field1List = entities.stream().map(YourEntity::getField1).collect(Collectors.toList());
    
    import java.util.stream.Collectors;
    
    List<String> field1List = entities.stream().map(urEntity -> urEntity.getField1()).collect(Collectors.toList());
    
    field1List.forEach(System.out::println);
    
    text1
    text3
    
    public class Bike {
    
        String bikeModel;
        Int price;
    }
    
    bikeList.map{ Bike b -> b.bikeModel }.toCollection(arrayListOf())