【问题标题】:Get the ArrayList<String> from ArrayList<CustomClass> (LF method to return string data as array instead of foreach)从 ArrayList<CustomClass> 获取 ArrayList<String>(LF 方法将字符串数据作为数组而不是 foreach 返回)
【发布时间】:2013-03-06 18:32:57
【问题描述】:

这是我的自定义 Class(为了便于阅读,我翻译了名称并省略了构造函数等)

public class MyClass {
    private long id;
    private String name, description;
    private int pictureId;
    ...
}

所以我使用这个类将所有数据存储为ArrayList&lt;MyClass&gt;

ArrayList<MyClass> items = getResources(); //fills the arraylist

我想返回它的所有名字。

是否可以编写像ArrayList&lt;String&gt; names = items.getAllNames(); 这样的自定义方法?因为我不知道将逻辑放在哪里来解决ArrayList 而不是Class

getAllNames()
{
    for (MyClass item : items){
        names.add(item.getName());
    }
}

每次我需要 ArrayList 中的某些内容时,都添加 foreach 行,但它看起来很乱。有没有干净的方法来解决这个问题?

【问题讨论】:

  • 我有只需要1行代码的方法,我明天去办公室看看。

标签: java class arraylist get


【解决方案1】:

您必须提供自定义类 MyClass 的 getter,我使用 List 接口而不是 ArrayList 作为返回类型,因为它更灵活。
你可以试试这个,如果有任何问题,请告诉我。
请找到代码sn-p:

 import java.util.ArrayList;
 import java.util.List;
   class Test{

        private List<MyClass> getResources() {
            // TODO Auto-generated method stub
                // Use your business logic over here
              ----------------------------------
            return new ArrayList<MyClass>();
        }
        // This is your method which will returns all the names
        public List<String> getAllNames(){
            List<String> names = new ArrayList<String>();
            List<MyClass> items = getResources();
            for (MyClass myClass : items) {
                names.add(myClass.getName());
            }
            return names;
        }
    }

这是你的 bean 类 MyClass,我只是在这里添加了 getter 和 setter。

    public class MyClass {
        private long id;
        private String name;
        private String description;
        private int pictureId;

        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }


     -------------------------------------
    }

【讨论】:

  • 感谢您的快速响应。你的解决方案看起来不错,我会试试这个,@Milian 他的解决方案,让你们知道它是否有效。 PS:您不必发布所有 getter 和 setter,为了便于阅读,我将它们放在问题中,但这并不重要:)
  • 好的,那么请试试这个,如果您有任何问题,请告诉我。我认为这应该可行。
【解决方案2】:

有两种明显的解决方案,一种是中间类,比如 ClassList,它包含 MyClass 的私有 ArrayList 和对其进行操作的方法。如果您需要的不仅仅是迭代器,则特别有用。另一种解决方案是将迭代器代码放在 MyClass 类本身中。这里使用的是中间类。

public ClassList {
    ArrayList<MyClass> list = null;

    public void ClassList () {
        if (list == null)
            list = new ArrayList<MyClass> ();
    }


    public ArrayList<String> getAllNames(ArrayList<MyClass> fred) {

        ArrayList<String> names = new ArrayList<String>();

        for (MyClass fred : items) {
            names.add(items.getName());
        }
        return names;
    }
}

看起来 Milan 在 MyClass 类中添加了一个示例。所以还有另一种方法。

【讨论】:

    【解决方案3】:

    您必须创建一个方法来遍历数组列表中的所有元素,并将每个名称添加到您将返回的第二个列表中。我还没有读过 Java 的 lambda 表达式,但如果我回忆起我的 C# 经验中的任何内容,那么你也许可以使用 Java 8 来做到这一点。

    public List<String> getNames(){
      List<String> names = new ArrayList<>();
      List<MyClass> elements = getElements();
    
      for(MyClass s : elements){
         names.add(s.getName());
      }
    
      return names;
    }
    

    【讨论】:

      【解决方案4】:

      尝试遵循这个结构:

      public class MyClass {
              private long id;
              private String name, description;
              private int pictureId;
              ...
          }
      
          public class Itemlist {
              public ArrayList<MyClass> items = new ArayList<MyClass>();
      
          public ArrayList<String> getAllNames()
          {
              ArrayList<String> names= new ArrayList<String>();
              for (MyClass item : items){
                  names.add(item.getName());
              }
          return names;
          }
      

      【讨论】:

      • 嘿,我相信您在 'ArayList' 处有错字并忘记了一个 } 好解决方案,thanx :)
      • 已经接受了 Shreyos Adikari 的回答,当我获得 2 个以上的声望时,我会投赞成票,别担心 :)
      【解决方案5】:

      如果可以导入Apache常用的实用程序包,那么可以是这样的:

          List<String> fieldsValues=
      (List<String>)CollectionUtils.collect(beanLs,new BeanToPropertyValueTransformer("fieldNameInBean"));
      

      【讨论】:

      • 是的,这就是我首先要寻找的。可惜只能接受一个答案...
      • 没关系,哥们,很高兴你解决了这个问题。顺便说一句,你可以投票。
      • 刚刚尝试了您的解决方案,似乎他找不到导入,但这可能是由于 android sdk 不兼容等原因造成的。投票还需要 2 点声望,所以如果有一天我对某个问题或答案多加点赞,我会马上点赞你的 :)
      猜你喜欢
      • 2019-05-06
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 2013-08-14
      相关资源
      最近更新 更多