【问题标题】:how to iterate through an array list of class type如何遍历类类型的数组列表
【发布时间】:2013-06-13 23:57:01
【问题描述】:

我有两个类 A 和 B。我想从 B 访问 A 中的数组列表。数组列表是 C 类类型,用于存储对象(数据包)。我想知道是否有任何方法可以遍历列表并从每个数据包中获取特定数据。

public class PcapStream
{
  PcapParser objPcapParser = new PcapParser();
  PcapDef numPackets = new PcapDef();
  int listSize = numPackets.getMaxPackets();

  public void findStream()
  {
    final ListIterator<PcapDef> packetIterator = objPcapParser.packet_list.listIterator();
    while(packetIterator.hasNext())
    {
      for(final int i=0; i<=listSize;i++)
      {

我从这样的事情开始。不确定它是如何工作的。 B类是PcapStream,A类是PcapParser,C类是PcapDef

ListIterator packetIterator = objPcapParser.packet_list.listIterator();
    while(packetIterator.hasNext())
    {
      for(int i=0; i<listSize; i++ )
      {
        PcapDef packet1 = (PcapDef) packetIterator.next();
        PcapDef packet2 = packetIterator; //here I would like to get the 2nd object from the list, not sure how to get that at this point.
      }
}
public int compare(final PcapDef packet1, final PcapDef packet2)
  {

   return 0; 
  }

我还在努力。在这一点上,这就是我所拥有的

    public void findStream()
      {
          try
          {
            for(int i=0;i<listSize;i++)
            {
              final List <PcapDef> list = new ArrayList<PcapDef>();
              final PcapDef packet1 = objPcapParser.packet_list.get(i);
              checkPackets(packet1, list, i);
            }
          }
          catch(final IndexOutOfBoundsException e)
          {
            System.out.println("Exception : " + e);
          }
        final Set packetSet = Stream.entrySet();
        final Iterator setIterator = packetSet.iterator();
        while(setIterator.hasNext())
        {
          final Map.Entry packetEntry = (Map.Entry) setIterator.next();
          System.out.print(packetEntry.getKey() + ": ");
          System.out.println(packetEntry.getValue());
        }
      }

      private void checkPackets(final PcapDef packet1, final List<PcapDef> list, final int i)
      {
        for(int j=1;j<listSize && j!=i;j++)
        {
          final PcapDef packet2 = objPcapParser.packet_list.get(j);
          final int value = compare(packet1,packet2);
          if(value == 0)
          {
            list.add(packet1);
list.add(packet2);
            checkPackets(packet2, list, i);
          }
          else
          {
            Stream.put(i,list); //add list to hashmap
          }
        }

      }

      @Override
      public int compare(final PcapDef packet1, final PcapDef packet2)
      {
        final String header1 = packet1.getHeader();
        final String header2 = packet2.getHeader();
        final String src_port1 = packet1.getSrc_port();
        final String dst_port2 = packet2.getDst_port();
final String src_port2 = packet2.getSrc_port();
        final String dst_port1 = packet1.getDst_port();
        System.out.println(header1 + header2);
        int flag = 1;
        try{
          if(header1.equalsIgnoreCase(header2))
          {
            if((src_port1.substring(10).equalsIgnoreCase(dst_port2.substring(10))) && (src_port2.substring(10).equalsIgnoreCase(dst_port1.substring(10)) )
            {
              flag = 0;
              return flag;
            }
          }
        }

@Andy 这是我到目前为止所写的。我面临的问题:正在生成重复项并且哈希图条目不连续,我的意思是索引 0,1,2 .. 而很少有位置是空的。因此,如果我将非常大的文件作为程序的输入,它会给我一个 indexoutofboundsexception。我是一个初学者,并尽我所能。请帮忙。

【问题讨论】:

  • 为什么没有呢?让我们看看你到目前为止有什么,否则你无法得到任何答案
  • 公共类 PcapStream { PcapParser objPcapParser = new PcapParser(); PcapDef numPackets = new PcapDef(); int listSize = numPackets.getMaxPackets(); public void findStream() { final ListIterator packetIterator = objPcapParser.packet_list.listIterator(); while(packetIterator.hasNext()) { for(final int i=0; i
  • 把这个放在你的问题中,而不是在评论中

标签: java arraylist iteration


【解决方案1】:

您可以使用Iterator.next() 方法获取下一个列表成员。每次调用 next() 都会前进到下一个列表成员。

while(packetIterator.hasNext())
{
  PCapDef packet = packetIterator.next();
  ...
}

编辑:

您可以使用Iterator.get(int) 方法通过索引获取列表成员。

while(packetIterator.hasNext())
{
  PCapDef packet = packetIterator.next();

  for(int i=0; i<listSize; i++ )
  {
    PcapDef packet2 = objPcapParser.packet_list.get( i )
    ...
  }    
}

【讨论】:

  • 我做到了。我的列表是我希望比较其值的对象列表。我正在尝试覆盖比较方法。如果您有任何建议,请告诉我
  • 你的问题没有提到 compare() 方法。向我们展示您目前所拥有的。
  • ListIterator packetIterator = objPcapParser.packet_list.listIterator(); while(packetIterator.hasNext()) { for(int i=0; i
  • 在确保它可以编译之后,把它放在你的问题中,而不是在评论中。
  • @Shanti - 我从嵌套循环中猜测您想通过索引访问其他列表成员(例如,可能将所有列表成员与所有其他成员进行比较)。我添加了一个如何通过索引获取列表成员的示例。我已将 next() 调用移至外循环 - 否则,它将在内循环的每次迭代中前进。
猜你喜欢
  • 1970-01-01
  • 2018-06-04
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多