2015-02-09 175 views
0

用于LARG-DB基于动态多区域菜单中,我创建了一个类MenuPoint:如何在扩展类后扩展类数组/属性类的数组属性?

class MenuPoint{ 
public int areaId; 

public int preID; 

public String name; 
public String desc; 

public String stepInImg = "bsp.img"; 
public String stepOutImg = "bsp.img"; 

public String detailedForm = "bsp.fxml"; 
public String detailedImg = "bsp.img"; 

public String [] additionalOptionForm = new String[0]; 
public String [] additionalOptionName = new String[0]; 
public String [] additionalOptionImg = new String[0];} 

和初始化它作为我的主类的长度为0的数组:MenuController
public MenuPoint [] menuItem = new MenuPoint[0];

我使用API​​调用通过初始化MenuController来获取DB存储的信息。

int dataStructlength = 12; 
    String[] exampleApiResultKeys = new String[dataStructlength]; 
    exampleApiResultKeys[0] = "SITE_NUMBER"; 
    exampleApiResultKeys[1] = "SITE_DESC"; 
    exampleApiResultKeys[2] = "SITE_NUMBER_EXT"; 
    exampleApiResultKeys[3] = "CELL_NUMBER"; 
    exampleApiResultKeys[4] = "CELL_DESC"; 
    exampleApiResultKeys[5] = "CELL_TYPE"; 
    exampleApiResultKeys[6] = "MACHINE_GROUP_NUMBER"; 
    exampleApiResultKeys[7] = "MACHINE_GROUP_DESC"; 
    exampleApiResultKeys[8] = "MACHINE_GROUP_TYPE"; 
    exampleApiResultKeys[9] = "STATION_NUMBER"; 
    exampleApiResultKeys[10] = "STATION_DESC"; 
    exampleApiResultKeys[11] = "STATION_TYPE"; 

    exampleApiController.test_mdataGetMachineAssetStructure(exampleApiFilter, exampleApiResultKeys); 

    for(int i = 0; exampleApiController.resultValues.value != null && i < exampleApiController.resultValues.value.length/12; i++) 
    { 
     boolean isUseless = false; 
     for(int a = 0; a < dataStructlength; a ++) 
      if(true == exampleApiController.resultValues.value[i*dataStructlength+a].trim().isEmpty()) 
       isUseless = true; 

     if(!isUseless) 
     { 
     int preId= -1; 
     if("M".equals(exampleApiController.resultValues.value[i*12+5])) 
     { 
      if(giveItemId(0, preId, exampleApiController.resultValues.value[i*12]) >= 0) 
       preId = giveItemId(0, preId, exampleApiController.resultValues.value[i*12]); 
      else 
       preId = addMenuItem(0, preId, exampleApiController.resultValues.value[i*12], exampleApiController.resultValues.value[i*12+1], "bsp.form"); 
     } 
     if("M".equals(exampleApiController.resultValues.value[i*12+5])) 
     { 
      if(giveItemId(1, preId, exampleApiController.resultValues.value[i*12+3]) >= 0) 
       preId = giveItemId(0, preId, exampleApiController.resultValues.value[i*12+3]); 
      else 
       preId = addMenuItem(1, preId, exampleApiController.resultValues.value[i*12+3], exampleApiController.resultValues.value[i*12+4], "bsp.form"); 
     } 
     if("M".equals(exampleApiController.resultValues.value[i*12+8])) 
     { 
      if(giveItemId(2, preId, exampleApiController.resultValues.value[i*12+6]) >= 0) 
       preId = giveItemId(0, preId, exampleApiController.resultValues.value[i*12+6]); 
      else 
       preId = addMenuItem(2, preId, exampleApiController.resultValues.value[i*12+6], exampleApiController.resultValues.value[i*12+7], "bsp.form"); 
     } 
     if("M".equals(exampleApiController.resultValues.value[i*12+11])) 
     { 
      if(giveItemId(3, preId, exampleApiController.resultValues.value[i*12+9]) >= 0) 
       preId = giveItemId(0, preId, exampleApiController.resultValues.value[i*12+9]); 
      else 
       preId = addMenuItem(3, preId, exampleApiController.resultValues.value[i*12+9], exampleApiController.resultValues.value[i*12+10], "bsp.form"); 
     } 
     } 

giveItemId: 我用下面的代码的结果存储

public int giveItemId(int areaId_temp, int preId_temp, String name_temp) 
{ 
    for(int i = 0; i < menuItem.length; i++) 
    { 
     if(menuItem[i].areaId == areaId_temp && menuItem[i].name.equals(name_temp) && menuItem[i].preID == preId_temp) 
      return i; 
    } 
    return -1; 
} 

addMenuItem:

public int addMenuItem(int areaId_temp, int preId_temp, String name_temp, String desc_temp, String form_temp) 
{ 
    Object newArray1 = Array.newInstance(menuItem.getClass().getComponentType(), Array.getLength(menuItem)+1); // +1 Arrayfeld 
    System.arraycopy(menuItem, 0, newArray1, 0, Array.getLength(menuItem)); 
    menuItem = (MenuPoint[]) newArray1; // expend but missing attributes 

    menuItem[menuItem.length-1].areaId = areaId_temp; 
    menuItem[menuItem.length-1].preID = preId_temp; 
    menuItem[menuItem.length-1].name = name_temp; 
    menuItem[menuItem.length-1].desc = desc_temp; 
    menuItem[menuItem.length-1].detailedForm = form_temp; 
    return menuItem.length-1; 
} 

我发现菜单项dons't花费之后进行的任何属性。

我是否必须创建MenuPoint的“新”实例才能使其工作? 甚至可以在不丢失属性或值的情况下花费类数组吗? 它很好用,因为最后menuItem只是一个指针数组,指向多个工作存储地址,不是吗?

谢谢你们提供任何提示或更好的概念,你可以给我。 (我知道这个班级概念很愚蠢,但我不知道更好的) 请原谅我的坏语法。

+0

使用'List'。这些会在添加项目时自动调整大小。当您知道施工时物品的确切数量时,阵列可用于;即使这样一个'List'通常更方便。 – 2015-02-09 08:35:22

+0

P.S.张贴之前请对您的问题进行拼写检查。 – 2015-02-09 08:36:21

+0

“我发现那menuItem ...”怎么样?你有一些代码来演示它吗? – laune 2015-02-09 08:41:17

回答

1

创建在方法addMenuItem然后将其与从现有的菜单项成员填充一个新的数组,但在指数(新)长度的元件 - 1没有被初始化:

menuItem[menuItem.length-1] = new MenuPoint(); 

你应该有尝试设置字段时收到NullPointerException。

java.lang.reflect.Array的所有这些用法都颇为人为。有更简单的方法来实现这一点。这里是addMenuItem

public int addMenuItem(int areaId, String name){ 
    MenuPoint[] newMenuItem = new MenuPoint[menuItem.length + 1]; 
    System.arraycopy(menuItem, 0, newMenuITem, 0, menuItem.length); 
    menuItem = newMenuItem; 
    menuItem[menuItem.length-1] = new MenuPoint(); 
    menuItem[menuItem.length-1].areaId = areaId; 
    menuItem[menuItem.length-1].name = name; 
    return menuItem.length; // Why -1 ? 
} 

的简化versio但是,最重要的,不要使用List<MenuPoint>

+0

好的,谢里...... 我改正了它。 但是感谢各位^^ – xXTobiXx 2015-02-09 09:11:39

1

对于你的问题Do I have to create "new" Instances of MenuPoint to make it work?

Yes

从你需要初始化MenuPoint类对象的值存储在阵列menuItem你的代码片段的答案。
通过menuItem = (MenuPoint[]) newArray1;

复制你阵列没有初始化有NullPointerException例外用于设置值设置为空对象之后初始化您的数组元素与下面线

menuItem[menuItem.length-1] = new MenuPoint(); 

地点上面的行。

有一些更好的方法来维护使用ArrayList类的对象列表。

要使用ArrayList你需要下面的代码改变

public List<MenuPoint> menuItem = new ArrayList<MenuPoint>; //Initialize list  

你的功能将被

public int addMenuItem(int areaId_temp, int preId_temp, String name_temp, String desc_temp, String form_temp) 
    { 
     MenuPoint menuPoint = new MenuPoint(); 

     menuPoint.areaId = areaId_temp; 
     menuPoint.preID = preId_temp; 
     menuPoint.name = name_temp; 
     menuPoint.desc = desc_temp; 
     menuPoint.detailedForm = form_temp; 
     menuItem.add(menuPoint); 

     return menuItem.size()-1; 
    } 

我觉得这比使用反射与阵列容易。

+0

谢谢,诅咒我必须这样做^^ 但是我认为laune是正确的:) 我应该使用列表^^ – xXTobiXx 2015-02-09 09:07:09