【问题标题】:Add all values of an instance of an object to a List将对象实例的所有值添加到列表
【发布时间】:2020-03-12 14:28:33
【问题描述】:

假设我有一个包含大量字符串值的类“狗”,并且我希望将所有这些值都放在一个列表中,有没有比自己添加每个值更好的方法?

例如拿这个虚拟类,注意如果重要的话,所有值都是字符串

public class Dog {
    private String breed;
    private String name;
    private String origin;
    [...] a lot more

    getter and setter methods
    }

Dog dog = new Dog([...] bla bla);

有没有比将实例的所有这些值放入列表更好的方法:

public List<String> toList() {
    List<String> list = new ArrayList<String>();
    list.add(dog.getBreed);
    list.add(dog.getName);
    list.add(dog.getOrigin);
    [...]
    return list;

【问题讨论】:

  • 可能toString 返回所有以, 为分隔符的值,然后拆分为List
  • 如果是列表的情况,只需编写名为add(String value) {//add to list}的方法。

标签: java list arraylist tolist


【解决方案1】:

你可以这样想,一只狗有几个属性或属性,比如品种类型、起源、名字等等。您也可以将值添加到列表中,但最好维护一张地图,因为在检索时您必须知道要检索的内容。

最好维护一个属性和实际值的映射。代码可能是这样的。

public class Dog {
    private Map<String,String> attributesMap = new HashMap<>();

    //getter and setter for attributesMap

}   

您可以创建 Dog 类的实例并添加这样的属性。

Dog dog = new Dog();
dog.getAttributesMap().put("breed", "some breed");
dog.getAttributesMap().put("origin", "some some origin");

System.out.println("What is the breed type: "+dog.getAttributesMap().get("breed");

【讨论】:

  • 感谢您的回答,遗憾的是,我不允许更改值在类中的存储方式或实例的初始化方式。所以这不适用于这项任务
  • 您能否解释一下“我不允许更改值在类中的存储方式”这一行,以便我为您提供帮助。
【解决方案2】:

您可以进行 json 序列化。 考虑下面的代码:

List<String> StringFieldList = Arrays.asList("breed", "name", "origin");
Gson gson = new Gson();
Dog dogObject = new Dog();
//set all field(s) value
JsonObject dogJsonObject  = (JsonObject) gson.toJsonTree(dogObject, Dog.class);

for (String field : StringFieldList) {
    String stringFieldValue = dogJsonObject.get(field).getAsString();
    //Add stringFieldValue in list            
}

【讨论】:

    【解决方案3】:

    使用反射可以尝试get对象的字段值:

    Dog dog = new Dog("labrador","tarzan","uk"); // sample
    List<String> values = Arrays.stream(Dog.class.getDeclaredFields())
            .filter(f ->f.getType().equals(String.class))
            .map(f -> {
      try {
        return (String) f.get(dog); // get the value of field from the object
      } catch (IllegalAccessException e) { 
        return ""; /// handle in a cleaner way
      }
    }).collect(Collectors.toList());
    

    【讨论】:

      【解决方案4】:

      你可以使用反射。

      Dog dog = new Dog("val1", "val2", "val3");
                  List<String> list = new ArrayList<>();
                  for(Field field: Dog.class.getDeclaredFields()) {
                      // since fields are private we need to first mark it accesible
                      field.setAccessible(true);
                      if( field.getType().equals(String.class)) {
                              list.add((String) field.get(dog));
                      }
                  }
      

      【讨论】:

      • 谢谢,这对我来说非常容易理解并且一切正常!
      【解决方案5】:

      它与您的解决方案没有太大区别,但至少它控制了一些作为列表返回的值。

      private List<String> allValues = new ArrayList<>();
      
      public Dog(String breed, String name, String origin) {
         this.breed = setAndReturn(breed);
         this.name = setAndReturn(name);
         this.origin = setAndReturn(origin);
      }
      
      private String setAndReturn(String value) {
         if (value != null) {
            allValues.add(value);   
         }
         return value;
      }
      
      public List<String> toList() {
         return allValues;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        • 2020-04-19
        • 1970-01-01
        • 2022-06-29
        • 2021-12-13
        • 1970-01-01
        相关资源
        最近更新 更多