如何使用迭代器从Java中的两个类检索对象
我是Java新手,正在学习集合。我在使用如何使用迭代器从Java中的两个类检索对象,java,arraylist,collections,iterator,Java,Arraylist,Collections,Iterator,我是Java新手,正在学习集合。我在使用迭代器从两个类对象中检索数据时遇到问题,我只能获取任何单个类的输出,而不能获取两个类的输出 这是我的代码: package ncl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.ArrayList; import java.util.Iterator; public class Tes
迭代器从两个类对象中检索数据时遇到问题,我只能获取任何单个类的输出,而不能获取两个类的输出
这是我的代码:
package ncl;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
Market m1 = new Market(1234, "Suryam", 1200.10);
Market m2 = new Market(4321, "SWathi", 1200.10);
Market m3 = new Market(1111, "Chinna", 1200.10);
Market m4 = new Market(2222, "Malli Bava", 1200.10);
Market m5 = new Market(3333, "Vali", 1200.10);
RetailShop rt1 = new RetailShop("Swathi", 8121720217l, 500087);
RetailShop rt2 = new RetailShop("Tumbu", 9989330442l, 500087);
RetailShop rt3 = new RetailShop("Suri Babu", 9010627821l, 500087);
ArrayList<Object> al = new ArrayList<Object>();
// Adding Market
al.add(m1);
al.add(m2);
al.add(m3);
al.add(m4);
al.add(m5);
// Adding RetailShop
al.add(rt1);
al.add(rt2);
al.add(rt3);
Iterator itr = al.iterator();
while(itr.hasNext())
{
Market mt=(Market)itr.next();
System.out.println(mt.billamount);
System.out.println(mt.customer);
System.out.println(mt.invoiceno);
RetailShop rts=(RetailShop)itr.next();
System.out.println(rts.custName);
}
}
}
ncl包;
导入java.sql.Connection;
导入java.sql.DriverManager;
导入java.sql.SQLException;
导入java.util.ArrayList;
导入java.util.Iterator;
公开课考试{
公共静态void main(字符串[]args){
市场m1=新市场(1234,“Suryam”,1200.10);
市场m2=新市场(4321,“斯瓦提”,1200.10);
市场m3=新市场(1111,“中国”,1200.10);
市场m4=新市场(2222,“Malli Bava”,1200.10);
市场m5=新市场(3333,“Vali”,1200.10);
零售店rt1=新零售店(“Swathi”,812170217L,500087);
零售店rt2=新零售店(“Tumbu”,9989330442l,500087);
零售店rt3=新零售店(“苏里巴布”,9010627821l,500087);
ArrayList al=新的ArrayList();
//添加市场
加上(m1);
加总面积(m2);
al.添加(m3);
新增(m4);
al.添加(m5);
//添加零售店
al.add(rt1);
al.add(rt2);
al.add(rt3);
迭代器itr=al.Iterator();
while(itr.hasNext())
{
市场mt=(市场)itr.next();
系统输出打印项次(百万美元);
系统输出打印项次(mt客户);
系统输出打印号(mt发票编号);
零售店rts=(零售店)itr.next();
System.out.println(rts.custName);
}
}
}
有人能告诉我我做错了什么吗?我想打印市场
数据以及零售店
数据使用instanceof
操作符检查列表中的对象类型
Iterator itr = al.iterator();
while (itr.hasNext()) {
Object o = itr.next();
if (o instanceof Market) {
Market mt = (Market) o;
System.out.println(mt.billamount);
System.out.println(mt.customer);
System.out.println(mt.invoiceno);
}
if (o instanceof RetailShop) {
RetailShop rts = (RetailShop)o;
System.out.println(rts.custName);
}
}
首先,ArrayList与object是不好的做法,更喜欢使用这个
List<Market> a1 = new ArrayList<>();
List<RetailShop> a2 = new ArrayList<>();
//Adding Market
al.add(m1);
al.add(m2);
al.add(m3);
al.add(m4);
al.add(m5);
//Adding RetailShop
a2.add(rt1);
a2.add(rt2);
a3.add(rt3);
for(Market mt:a1){
System.out.println(mt.billamount);
System.out.println(mt.customer);
System.out.println(mt.invoiceno);
}
for(RetailShop rts:a2){
System.out.println(rts.custName);
}
它的作用是检查列表中每个元素的类。如果它是一个市场,它会将对象投射到一个市场,并为其执行相关代码。零售店也收到了。由于您的列表中包含了对象,您需要先检查类型,然后再进行转换
List<Object> l = Arrays.asList(1, null, 3, "Hello", 5, null);
Iterator<Object> it = l.iterator();
while (it.hasNext()) {
Object x = (Object) it.next();
if (x != null) {
System.out.println("getClass: " + x.getClass());
if ("integer".equalsIgnoreCase(x.getClass().getSimpleName())) {
System.out.println("This is an int: " + (Integer) x);
} else if ("string".equalsIgnoreCase(x.getClass().getSimpleName())) {
System.out.println("This is a string: " + (String) x);
}
} else {
System.out.println("the element is null");
}
}
List l=Arrays.asList(1,null,3,“Hello”,5,null);
迭代器it=l.Iterator();
while(it.hasNext()){
Object x=(Object)it.next();
如果(x!=null){
System.out.println(“getClass:+x.getClass());
if(“integer”.equalsIgnoreCase(x.getClass().getSimpleName())){
System.out.println(“这是一个整数:”+(整数)x);
}else if(“string”.equalsIgnoreCase(x.getClass().getSimpleName())){
System.out.println(“这是一个字符串:”+(字符串)x);
}
}否则{
System.out.println(“元素为空”);
}
}
由于在同一个ArrayList中有不同的对象(Market和RetailShop),因此在强制转换该对象之前,应首先检查该对象是否是正确的(右侧)对象。例如,要将对象投射到市场,您应该确保该对象是市场
Iterator itr=al.iterator();
while(itr.hasNext())
{
Object obj=itr.next();
if (obj instanceof Market){
Market mt=(Market)obj;
System.out.println(mt.billamount);
System.out.println(mt.customer);
System.out.println(mt.invoiceno);
}
else {
if(obj instanceof RetailShop)
{
RetailShop rts=(RetailShop)obj;
System.out.println(rts.custName);
}
}
}
也许你可以用try/catch将cast包装到Market
,因为如果失败,它将抛出ClassCastException
。一旦发现此类异常,您可以尝试转换到RetailShop
并打印相关信息。您尝试交替阅读Market
和RetailShop
。但他们不在你的名单上。它们是M,M,M,M,M,R,R
避免在ArrayList
中混用东西。创建ArrayList
和ArrayList
,并用它们自己的迭代器(两个不同的循环)迭代这些集合。请演示如何使用列表a1=new ArrayList()检索数据;列表a2=新的ArrayList();你让它变得简单了,不过+1@Thijs Steel,谢谢
Iterator itr=al.iterator();
while(itr.hasNext())
{
Object obj=itr.next();
if (obj instanceof Market){
Market mt=(Market)obj;
System.out.println(mt.billamount);
System.out.println(mt.customer);
System.out.println(mt.invoiceno);
}
else {
if(obj instanceof RetailShop)
{
RetailShop rts=(RetailShop)obj;
System.out.println(rts.custName);
}
}
}