我应该遍历这些数字的数组,即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变量,使其等于较小数组中存在的元素的索引。

如果该数字不存在,请在下一次运行4之后像这样说。然后,程序会将MRU变量中的元素替换为数字4。

我有两个问题,


该程序只是向我吐出原始号码和idk,为什么?
我从这里去哪里?


我已经为此工作了很多天,经历了无数变化。它已经过了到期日,但是我想学习如何做。

   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];
        }


我从几个角度进行了研究,但是似乎没有任何效果。

最佳答案

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(" }");
}

10-06 10:03