0

我在另一个论坛上问过同样的问题,但没有得到任何合适的答案……所以我把它贴在这里。我有以下程序:

    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' 匹配的值。所有 ArrayList 的大小相同,并且包含在任何给定索引处彼此对应的值。我怎样才能做到这一点?

示例: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

这是这种情况。我从用户那里得到价值 time=2 cpu=12 state =4..我找到了匹配,然后我想查找所有对应于 cpu=12 的值。

4

4 回答 4

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 方法负责为对象定义唯一值。因此,当您创建具有相同输入的对象时,应该生成相同的哈希码。

你用这些元素创建你的收藏

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
}

实现哈希码

编辑:

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

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

Map> dataMap = new HashMap<>();// Java 菱形表示法。

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

于 2013-06-25T07:50:17.367 回答
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);
    }
}
于 2013-06-25T08:25:58.753 回答
0

Java是纯oo语言。这意味着您不仅必须以面向对象的风格编写代码,而且还要将一切都视为像现实世界一样的对象。在找到如何解决这个问题之前,我建议您仔细阅读 Java 中的 OOP 和 Connections 框架。

于 2013-06-25T08:03:48.760 回答
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())。希望这可以帮助

于 2013-06-25T08:28:41.900 回答