在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数据类型,它们实现相同的接口,因此这也是一个很好的答案