Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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从抽象集合的ArrayList生成swt.table_Java_Arraylist - Fatal编程技术网

JAVA从抽象集合的ArrayList生成swt.table

JAVA从抽象集合的ArrayList生成swt.table,java,arraylist,Java,Arraylist,你好 我的情况如下: 我有一些数据库实体类(Auto,Driver,Bill,等等)及其字段。我可以从我的数据库中获取它们的ArrayList-ArrayList,ArrayList,等等 现在,我希望能够从我拥有的任何集合生成swt表。 所以,在我的梦中,它就像是所有类集合的一个通用方法 public class TableGenerator{ public Table generate(Shell shell, ArrayList<? extends IDBEntity>

你好

我的情况如下:

我有一些数据库实体类(
Auto
Driver
Bill
,等等)及其字段。我可以从我的数据库中获取它们的ArrayList-
ArrayList
ArrayList
,等等

现在,我希望能够从我拥有的任何集合生成swt表。 所以,在我的梦中,它就像是所有类集合的一个通用方法

public class TableGenerator{
    public Table generate(Shell shell, ArrayList<? extends IDBEntity> instance){
        //swt.table creation
        //passing data into this table
    }
}
公共类表格生成器{

公共表生成(Shell,ArrayList)实现这一点的一种方法是使用
访问者模式

  • 创建一个
    Visitor
    界面:

    public interface DBEntityVisitor {
      void visit(Auto pAuto);
      void visit(Driver pDriver);
      void visit(Bill pBill);  
    }
    
  • 转到
    IDBEntity
    界面并添加方法:

     void accept(DBEntityVisitor pDBEntityVisitor);
    
  • 现在转到具体的类
    Auto
    Bill
    Driver
    ,并实现
    accept
    方法:

      @Override
      public void accept(DBEntityVisitor pDBEntityVisitor) {
         pDBEntityVisitor.visit(this);
      }
    
  • 表格生成器中

       public Table generate(Shell shell, ArrayList<IDBEntity> instance){
         DBEntityVisitor lVisitor = new DBEntityVisitor() {
    
         @Override
         public void visit(Auto pAuto) {
            System.out.println("I am a car");
         }
    
         @Override
         public void visit(Driver pDriver) {
            System.out.println("I am a driver");        
         }
    
         @Override
         public void visit(Bill pBill) {
            System.out.println("I am a bill");
         }
      };
      for(IDBEntity lInstance : instance){
        lInstance.accept(lVisitor);
      }
    }
    
    生成公共表(Shell、ArrayList实例){
    DBEntityVisitor lVisitor=新的DBEntityVisitor(){
    @凌驾
    公众无效访问(自动pAuto){
    System.out.println(“我是一辆车”);
    }
    @凌驾
    公众无效访问(驾驶员pDriver){
    System.out.println(“我是司机”);
    }
    @凌驾
    公众无效访问(Bill pBill){
    System.out.println(“我是一张账单”);
    }
    };
    for(IDB实体实例:实例){
    lInstance.accept(lVisitor);
    }
    }
    

  • 如果您希望它非常动态,您可以通过将数组设置为JSON数组和对象设置为JSON对象来使用所提供的内省

    Gson gson = new Gson();
    
    List<IDBEntity> l = new ArrayList<>();
    l.add(new Auto());
    l.add(new Driver());
    l.add(new Bill());
    
    String json = gson.toJson(l);
    // Just to view if data is alright.
    System.out.println(json)
    
    JsonArray a = new JsonParser().parse(json).getAsJsonArray();
    
    // Iterate array
    for (JsonElement o: a) {
        // Iterate fields and values of each object
        for (Map.Entry<String, JsonElement> e: ((JsonObject) o).entrySet()) {
            System.out.println(e.getKey());
            System.out.println(e.getValue());
        }
    }
    
    Gson-Gson=new-Gson();
    列表l=新的ArrayList();
    l、 添加(新的Auto());
    l、 添加(新驱动程序());
    l、 增加(新法案());
    字符串json=gson.toJson(l);
    //只是为了查看数据是否正常。
    System.out.println(json)
    JsonArray a=new-JsonParser().parse(json.getAsJsonArray();
    //迭代数组
    对于(JsonElement o:a){
    //迭代每个对象的字段和值
    对于(Map.Entry e:((JsonObject)o.entrySet()){
    System.out.println(e.getKey());
    System.out.println(e.getValue());
    }
    }
    

    现在检查对象数组,检查其属性以添加列,然后运行每个对象并将其属性值添加到列中。

    是否希望
    IDBEntity
    的任何子类的字段在表中显示为列?哇,太好了,我将尝试在使用的每个循环中接受它,因为认为ArrayList包含不同的DbEntity?是的,我认为它包含实现IDBEntity的不同对象。然而,如果列表仅包含Auto的,则Auto的visit方法将被执行n次。我还需要为表生成标头。因此,我认为我应该拒绝使用此循环并调用一次“accept”方法。无论如何,你的代码太棒了,我应该再次感谢你:)是的,我知道这就是我的解决方案的原因。您可以在每个具体类的visitor方法中添加单独的内容。从我的观点来看,不必使用json并添加json库。哇,谢谢。我从未在java中使用json,所以我需要一点时间来实现您的建议:)拥有json版本总是很好的根据手头的数据,我想:-)是的,一点也不争论,但在我的场合,时间就是金钱:)有时花时间,节省你以后的时间。