循环遍历多个ArrayLists

时间:2013-06-25 07:39:05

标签: java

我在另一个论坛上问过同样的问题,但是得到任何合适的答案......所以我在这里发帖。我有以下程序:

    public void execute(){  

      public static ArrayList<Long> time = new ArrayList<Long>();  
      public static ArrayList<Integer> state = new ArrayList<Integer>();  
      public static ArrayList<Integer> cpu = new ArrayList<Integer>();  

     for(int i=0; i<time.size(); i++){  

        if(cpu.get(i).equals(get)){  

        Long next_time = time.get(i);  
        Integer next_func = state.get(i);  
        Integer next_proc = cpu.get(i);  

            if(next_time.equals(g) && (next_func.equals(test1.func_num))){  



                Integer func_next = stt.get(i+1);  

                if(func_next.equals(0)||(func_next.equals(next_func))) {  
                    System.out.println("here");  
                }  

                else   
                    System.out.println("here");  
                    if(cpu.get(i+2).equals(get))  
                        if(stt.get(i+2).equals(func_next) || (stt.get(i+2).equals(0)))    
                            System.out.println(stt.get(i+2));  

            }  
    }  

    }  

我想要做的是:我从用户那里得到时间,cpu和状态的值。在arraylist中找到相应值的匹配,然后我想遍历arraylists 仅用于那些匹配'cpu'的值。所有ArrayLists都具有相同的大小,并且包含在任何给定索引处相互对应的值。我怎么能这样做?

实施例: ArrayLists包含各种值,如下所示:

time = 1 cpu = 12 state = 24
time = 2 cpu = 12 state = 4
time = 5 cpu = 13 state = 23
time = 6 cpu = 13 state = 26
time = 8 cpu = 11 state = 34
time = 11 cpu = 12 state = 54
time = 13 cpu = 12 state = 56
time = 14 cpu = 11 state = 58
time = 15 cpu = 15 state = 46

就是这种情况。我得到了用户的价值,因为时间= 2 cpu = 12 state = 4 ....我找到了匹配,之后我想查找对应于cpu = 12的所有值..

4 个答案:

答案 0 :(得分:2)

更多地基于描述然后代码示例

您以时间,cpu和状态形式用户的形式获得输入。 您想要找到这些输入条件的匹配项。

为了能够轻松地做到这一点,您应该为此创建一个类型。

public class Data {

 private final int   cpu;
 private final long time;
 private final int state;  

 public Data(int cpu, long time, int state) {
    this.cpu   = cpu;
    this.time  = time;
    this.state = state;
 }

 //add implementation for equals and hashcode methods. 

}

equals和hash code方法负责定义object的唯一值。因此,当您使用相同的输入创建对象时,应生成相同的哈希码。

您使用这些元素创建集合

Set<Data> storage = new HashSet<Data>();

在此storage中,您应该存储要执行搜索的所有数据。

搜索很简单。您创建了一个搜索项

Data searchItem = new Data(user.getCpu(), user.getTime(), user.getState());

if(storage.contains(searchItem)) {
  // action on true
} else {
 // action on false
}

Implementing hash code

编辑:

问:如何对给定的CPU执行所有项目?

要支持此类操作,您必须在代码中具有可根据决策为您提供某种数据的结构。通常对于此操作使用类型Map。此类型允许在值的关键引用下收集。该值可以是对象的集合。

地图&GT; dataMap = new HashMap&lt;&gt;(); // Java钻石符号。

或者你可以使用番石榴的[Multimap]。

答案 1 :(得分:0)

Java是纯粹的oo语言。这意味着你不仅必须用面向对象的风格写作,还要把所有东西都想象成现实世界的对象。在找到如何解决这个问题之前,我想建议您在Java中仔细阅读OOP和Connections框架。

答案 2 :(得分:0)

这样的事情应该有效:

bool matchFound = false;
for (int i = 0; i < time.size(); i++) {
    long thisTime = time.get(i);  
    int thisState = state.get(i);  
    int thisCpu = cpu.get(i);

    if (matchFound) {
        if (thisCpu == userCpu) {
            System.out.println("Time: " + thisTime + " "
                             + "State: " + thisState + " "
                             + "Cpu: " + thisCpu);
        }
    } else {
        matchFound = (thisTime == userTime 
                   && thisState == userState
                   && thisCpu == userCpu);
    }
}

答案 3 :(得分:0)

当您找到匹配项时,请执行以下操作:

//once you have the index in a Integer var called myVal
Set<Integer> indexes = new HashSet<Integer>();
for(int i=0; i<time.size(); i++){
   if (cpu.get(i) == myVal) {
      indexes.add(i);
   }
}

现在您可以使用索引集:

for (Integer index: indexes) {
   //do whatever
}

这是O(time.size())。希望这有帮助