Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.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 - Fatal编程技术网

在Java中,在对象集合上泛化迭代函数

在Java中,在对象集合上泛化迭代函数,java,Java,我必须将这个重复的代码推广到一个方法中,这可能吗 //attrrischio SagTblObjAttrischioang sagTblObjAttrischioang = elemtOut.getAttrischio(); if(sagTblObjAttrischioang.length()>0) { for (int j = 0; j <sagTblObjAttrischioang.length(); j+

我必须将这个重复的代码推广到一个方法中,这可能吗

//attrrischio
        SagTblObjAttrischioang sagTblObjAttrischioang = elemtOut.getAttrischio();

        if(sagTblObjAttrischioang.length()>0)
        {
            for (int j = 0; j <sagTblObjAttrischioang.length(); j++) {
                SagObjAttrischioang item = sagTblObjAttrischioang.getElement(j);

                System.out.println(ToStringEntities.toString(item));
            }
        }

//          beni

SagTblObjBeniang sagTblObjBeniang = elemtOut.getBeni();

        if(sagTblObjBeniang.length()>0)
        {
            for (int j = 0; j <sagTblObjBeniang.length(); j++) {
                SagObjBeniang item = sagTblObjBeniang.getElement(j);

                System.out.println(ToStringEntities.toString(item));
            }
        }
//吸引器
SagTblObjAttrischioang SagTblObjAttrischioang=elemtOut.getAttrischio();
如果(sagTblObjAttrischioang.length()>0)
{
对于(int j=0;j 0)
{

对于(int j=0;j如何将其封装在:

public void myMethod()
{
  ... your code...
}
然后循环:

while (true)
  myMethod();

这样就可以了:)

如果在两个循环中都需要打印每个项目的toString(),那么这样的方法就足够了:

public void printItems(Iterator<Object> items){
    while(items.hasNext()){
        Object item = items.next();
        System.out.println(item.toString());
    }
}
public void打印项(迭代器项){
while(items.hasNext()){
Object item=items.next();
System.out.println(item.toString());
}
}

您可以重写所有实体的
toString
方法,以按您需要的格式打印。

我看到您的
SagObjAttrischioang
sagtbobjbeniang
(无论是什么?)类都支持
getElement(int)
方法。 如果它们都不是从抽象类继承的,也不是实现接口的,那么您应该重构这些类的代码。 然后,您可以将
elemtOut
重构为这个抽象类或接口的集合,这将使迭代更加容易。
为什么不发布您正在使用的类的代码呢?我认为类的设计需要一些改进。

SagTblObjAttrischioang
和SagTblObjBeniang都实现了一个公共接口(例如
SagTabObj
并实现
length
getElement
等方法返回另一个
公共接口SabTab

然后创建一个公共方法,如

public void printItems(SabTabObj item){
   if(item.length()>0)
    {
        for (int j = 0; j < item.length(); j++) {
            SagTab sabTab = item.getElement(j);

            System.out.println(ToStringEntities.toString(sabTab));
        }
    }
}
public void打印项(sabtabj项){
如果(item.length()>0)
{
对于(int j=0;j
如果您想同时涵盖阵列和Iterable(这是您所关心的接口…因为您需要通过它们进行iter)。请使用类似的方法:

import java.util.Arrays;

[...]

public static void printAll(Object[] stuff) {
    printAll(Arrays.asList(stuff));
}

public static void printAll(Iterable<?> stuff) {
    for (Object o : stuff) {
        System.out.println(o);
    }
}
导入java.util.array;
[...]
公共静态void printAll(对象[]填充){
printAll(Arrays.asList(stuff));
}
公共静态void printAll(Iterable stuff){
用于(对象o:对象){
系统输出打印ln(o);
}
}
您需要两个函数,因为Java中的数组是一种特殊类型的对象。“foreach”循环将处理集合为空的情况(顺便说一句,普通for循环也是如此,检查length>0只为您保存一个int声明)


此外,如果对象不是基本基类型(byte、char、short、int、long、float、double和boolean)之一,则会在println()上自动调用object.toString(),因此无需在代码中自己使用它(使代码尽可能短)。

我考虑两种解决方案:

  • 你应该让你的类实现同一个接口(或者从同一个类继承)
  • 这可能看起来很愚蠢,但如果您的类
    SagObjAttrischioang
    SagTblObjBeniang
    只实现
    lenght()
    getElement(int)
    ,为什么不使用List?(甚至是collection)

  • elemtOut是什么样的数据结构?它是一个包含200个对象表的所有结构的元素。这些对象都是ORACLE数据类型。如果
    sabtabj.length()
    不是O(1),则不需要检查长度,而且成本可能会很高(在某些具有特定函数的动态集合中可能是这种情况)因此,避免调用它两次。否?对象都是ORACLE数据类型,它们实现相同的接口,因此这也是一个很好的答案