MRU页面替换Java

时间:2012-11-30 21:25:30

标签: java

我应该通过这些数字的数组,7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1然后将第一个(非重复数字)放入一个较小的数字中只包含5个数字的数组。

所以在前五个之后,它看起来像7 0 1 2 3(因为0已经存在于数组中)。

然后它应该搜索并比较较大数组其余部分中的每个元素与较小数组中的每个元素。 Ť

较大数组中的下一个元素是0,程序需要将0与较小数组中的所有元素进行比较。

如果元素存在于较小的数组中,则它应该设置一个MRU变量,该变量等于较小数组中存在的元素的索引。

如果数字不存在,比如说在下一次运行之后,那么程序将用MRU变量替换数字4。

我有两个问题,

  1. 这个程序只是向我吐出原始数字和idk,为什么?
  2. 我从哪里开始?
  3. 我已经为此工作了很多天,经历了无数的变化。它已经过了截止日期,但我想学习如何做到这一点。

       import java.util.*;
       import java.io.*;
    
       public class MRUPageReplacement
       {
        public static void main(String [] args)
       {
      //======== Variables ==============================================
         ArrayList<Integer>MRUList = new ArrayList<Integer>();
         int [] frames = {7,0,1,2,3};
         int i,j,MRU;
         String line;
    
    
      //======== File Reader ============================================
         try
         {      
            FileReader reader = new FileReader("MRU.txt");      
            BufferedReader r = new BufferedReader(reader); 
            while ((line=r.readLine())!=null)
            {
               MRUList.add(Integer.parseInt(line));
            }
         }
            catch(Exception e)
            {
               System.out.println("File Not Found");
            } 
    
         int[] array = new int [MRUList.size()];
         for (i =0; i < MRUList.size(); i++)
         {
            array[i] =  MRUList.get(i);
         } 
    
      //======== Fill Arrays ============================================== 
    
    
      //======== Compare ==============================================       
         for(i=0; i<array.length; i++) 
            {     // Iterate through the array
            for( j=0; j<frames.length; j++) 
                {   // Iterate through frames
               if(array[i] == frames[j]) 
                    {
                // if the element is in frames
                MRU = j;
               }
               else {
               // if the element is not in frames
                frames[MRU] = array[i];   
    
               }
            }
         }
    
    
      /*======== Print ==============================================
         for(i=0; i<frames.length; i++)
         {
            System.out.println("frames : " + frames[i]);
         }  
      */
    
      }
    }
    
    
    
    
    // Sample output
    frames : 7
    frames : 0
    frames : 1
    frames : 2
    frames : 3
    frames : 0
    frames : 0
    frames : 1
    frames : 2
    frames : 3
    frames : 0
    frames : 1
    frames : 1
    frames : 2
    frames : 3
    frames : 0
    frames : 1
    frames : 2
    frames : 2
    frames : 3
    frames : 0
    frames : 1
    frames : 2
    frames : 2
    frames : 3
    frames : 3
    frames : 1
    frames : 2
    frames : 2
    

    另一方面,当我尝试打印出数组而不是数字时,它给出了这个:[I @ 565b540e。是因为它正在打印索引吗?

    最终我想在每次运行时打印出帧数组。喜欢: 运行1:帧= {70123}。

    编辑:好的,经过Noctua的一些惊人的帮助,我现在遇到了以前遇到的主要问题。它只识别我无法分辨的第一次或第二次迭代,因为第二个数字应该是零。这是搞乱的部分:

    for(i=0; i<array.length; i++) 
         {     // Iterate through Array 
            for( j=0; j<frames.length; j++) 
            {   // Iterate through Frames 
               if(array[i] == frames[j]) 
               {
                // Item from Array exists in Frames
                  MRU = j;
                  MRU_found = true;
               }
            }
            if(!MRU_found) 
                {
               frames[MRU] = array[i];
            }
    

    我从几个角度开始研究它,但似乎没有任何工作。

1 个答案:

答案 0 :(得分:1)

for(i=0; i<array.length; i++) {        // Iterate through the array
    for( j=0; j<frames.length; j++) {  // Iterate through frames
       if(array[i] == frames[j]) { // if the element is in frames
           MRU = j;
       } else {
           // if the element is not in frames
           frames[MRU] = array[i];   
       }
    }
 }

这是你的错误。不是搜索整个frames数组,然后检查你是否遇到了框架,而是将else - 子句放在循环中。

你可能意味着什么,就像:

for(i = 0; i < array.length; i++) {
    for(j = 0; j < frames.length && !MRU_found; j++) {
        if(array[i] == frames[j]) {
            MRU = j;
            MRU_found = true;
        }
    }
    if(!MRU_found) {
        frames[MRU] = array[i];
    }
}

编辑:关于你的问题,你打印的是内存中数组的地址。

要每次打印数组,请将代码更改为:

for(i = 0; i < array.length; i++) {
    for(j = 0; j < frames.length && !MRU_found; j++) {
        if(array[i] == frames[j]) {
            MRU = j;
            MRU_found = true;
        }
    }
    if(!MRU_found) {
        frames[MRU] = array[i];
    }
    System.out.print("frams: {");
    for(j = 0; j < frames.length; j++) {
        System.out.print(" ");
        System.out.print(frames[j]);
    }
    System.out.println(" }");
}