【解決方法】rating.list のデータを読み取り、次の形式のクエリに応答する、rankmovies というプログラムを作成します。


質問:
この問題セットの目的は、ヒープと優先度に慣れることです。
尾。
Internet Movie Database (http://www.imdb.com) は、映画のオンライン データベースです。
映画、テレビ番組、ビデオに関する情報。 普通にダウンロードできます
テキストデータファイル; 指示は http://www.imdb.com/interfaces にあります。 読んでください
http://www.imdb.com/help/ にあるデータの使用制限に関する声明
show_leaf?usedatasoftware.
この演習では、ファイル rating.list を使用して作業します。
データベース内の映画、視聴者が映画をどのように採点したかに関する情報。 ここ
は典型的なエントリです:
0000012211 29974 7.4 スラップショット (1977)
各レビュアーは、映画に 1 (最低) から 10 (最高) のスコアを割り当てます。 最初のグループ
10 桁のうち、対応する数値を与えた視聴者の割合を示します
スコア。 「スラップ ショット」では、0 ~ 10% の視聴者が映画に 1 を付けました。
視聴者の 20 ~ 30% が映画に 8 を付け、視聴者の 10 ~ 20% が
映画は10など。 次の数字は総レビュー数で、
3 番目の数値は平均スコアです。 次に、映画の名前と年が続きます。
rating.list のデータを読み込み、RankMovies というプログラムを作成します。
次の形式のクエリに応答します。 ユーザーは 2 つの整数、たとえば k と
m、0 ≤ k ≤ 2 × 106 および 0 ≤ m ≤ 105
. 次に、プログラムが次のようにリストされます。
レーティングの降順、最もレーティングの高い m 件の映画
少なくともk件のレビュー。 プログラムはループし、入力を受け入れてリストを生成する必要があります
入力数値の少なくとも 1 つが 0 になるまで。各リストの後に、
リストの作成にかかった時間 (ミリ秒)。 スクリーンショットが
次のページ。
Moodle にはいくつかのファイルがあります。 ファイル rating-utf8 には、評価のリストが含まれています。
追加情報が取り除かれ、UTF-8 文字セットに変換されます。 もしあなたの
コンピュータが別の文字セットを使用している場合は、変更する必要があります。 例えば、
Eclipse で、[実行]、[実行構成]、[共通]、[エンコーディング]の順にクリックして選択します。
「その他」とUTF-8。 ファイル MaxHeap.java には、優先順位の実装が含まれています。
最大ヒープに基づくキュー。 MovieRating.java はレコードを格納するためのクラスです
映画情報の。 最後に、RankMovies.java には、必要なスターター コードが含まれています。
入力ステートメントと出力ステートメント。

TLDR; この問題は、「RankMovies.java」というプログラムを作成し、ユーザー入力によって与えられた最小評価で、特定のファイルから上位の数の映画をランク付けするように割り当てられました。 これを行う方法について誰か助けてもらえますか? ありがとうございました。
問題に使用するために与えられたコード:
MovieRating.java

Java
import java.util.LinkedList;
import java.util.Scanner;

public class MovieRating implements Comparable<MovieRating> 
{
   private int votes;
	private float rating;
	private String title;

	MovieRating(String v, String r, String t) 
   {
       votes = Integer.parseInt(v);
       rating = Float.parseFloat(r);
       title = t;
	}
	public int getVotes() 
   {
		return votes;
	}
	public float getRating() 
   {
		return rating;
	}
	public String getTitle() 
   {
		return title;
	}
	public String toString() 
   {
		String s = Integer.toString(votes)+"  "+
                        Float.toString(rating) + " " + title;
		return s;
	}
   public int compareTo(MovieRating m) 
   {
      if(this.rating - m.rating > 0.0)
      {
          return 1;
      }
      else if(this.rating - m.rating < 0.0)
      {
          return -1;
      }
      else
      {
          return 0;
      }
   }
}

ランクムービー.java

Java
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Collections;

/* Starter code for PS8.
 */

public class RankMovies {

	public static void main(String[] args) {
                File file = new File("../resource/asnlib/publicdata/ratings-utf8");

		ArrayList<MovieRating> rl = new ArrayList<MovieRating>();

		try {
			Scanner scanner = new Scanner(file);
			while (scanner.hasNextLine()) {
                                /* Read in lines, using fact that the
                                 * title starts in column 32, and the
                                 * other information is separated by
                                 * 1 or more blanks.
                                 */
				String line = scanner.nextLine();
				String pre = line.substring(0, 31);
				String post = line.substring(32);
				String[] tkns = pre.split("\\s+");

				MovieRating nr = new MovieRating(tkns[2], tkns[3], post);
				rl.add(nr);
			}
			scanner.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}

		int minVotes = 1;
		int numRecords = 1;
		Scanner input = new Scanner(System.in);
		while (true) {
			System.out.println();
			System.out.println("Enter minimum vote threshold and number of records:");
			minVotes = input.nextInt();
			numRecords = input.nextInt();
			if (minVotes * numRecords == 0)
				break;
			long startTime = System.currentTimeMillis();

/* Fill in code to determine the top numRecords movies that have at least
 * minVotes votes. For each record mr, in decreaseing order of average rating,
 * execute a System.out.println(mr).
 * Do not sort the movie list!
 */

			System.out.println();;
			long readTime = System.currentTimeMillis();
			System.out.println("Time: "+(System.currentTimeMillis()-startTime)+" ms");
		}
	}
}

Maxheap.java

Java
import java.util.ArrayList;
import java.util.Arrays;

/** Max-heap implementation */
public class MaxHeap<E extends Comparable<E>> 
{
	private ArrayList<E> Heap;
	private int n; // Number of things in heap
	/** Constructor for initially empty heap */
	public MaxHeap() 
   {
		Heap = new ArrayList<E>();
		n = 0;
	}
	public MaxHeap(E[] h) 
   {
		Heap = new ArrayList<E>(Arrays.asList(h));
		n = h.length;
		buildheap();
	}
	/** @return Current size of the heap */
	public int heapsize() 
   {
		return n;
	}
	public boolean isEmpty() 
   {
		return n == 0;
	}
	/** @return True if pos a leaf position, false otherwise */
	public boolean isLeaf(int pos) 
   {
		return (pos >= n / 2) && (pos < n);
	}
	/** @return Position for left child of pos */
	public int leftchild(int pos) 
   {
		assert 2 * pos + 1 < n : "Position has no left child";
		return 2 * pos + 1;
	}
	/** @return Position for right child of pos */
	public int rightchild(int pos) 
   {
		assert 2 * pos + 2 < n : "Position has no right child";
		return 2 * pos + 2;
	}
	/** @return Position for parent */
	public int parent(int pos) 
   {
		assert pos > 0 : "Position has no parent";
		return (pos - 1) / 2;
	}
	/** Insert val into heap */
	public void insert(E val) 
   {
		Heap.add(val); // Start at end of heap
		int curr = n;
		n++;
		// Now sift up until curr parents key > currs key
		while ((curr != 0) && (Heap.get(curr).compareTo(Heap.get(parent(curr))) > 0)) 
      {
			swap(curr, parent(curr));
			curr = parent(curr);
		}
	}
	/** Heapify contents of Heap */
	public void buildheap() 
   {
		for (int i = n / 2 - 1; i >= 0; i--)
      {
			siftdown(i);
      }
	}
	/** Put element in its correct place */
	private void siftdown(int pos) 
   {
		assert (pos >= 0) && (pos < n) : "Illegal heap position";
		while (!isLeaf(pos)) 
      {
			int j = leftchild(pos);
			if ((j < (n - 1)) && (Heap.get(j).compareTo(Heap.get(j + 1)) < 0))
         {
				j++; // j is now index of child with greater value
         }
			if (Heap.get(pos).compareTo(Heap.get(j)) >= 0)
         {
				return;
         }   
			swap(pos, j);
			pos = j; // Move down
		}
	}
	/** Remove and return maximum value */
	public E removemax() 
   {
		assert n > 0 : "Removing from empty heap";
		swap(0, --n); // Swap maximum with last value
		if (n != 0) // Not on last element
      {
			siftdown(0); // Put new heap root val in correct place
      }
		return Heap.get(n);
	}
	private void swap(int i, int j) 
   {
		E temp = Heap.get(j);
		Heap.set(j, Heap.get(i));
		Heap.set(i, temp);
	}

}

私が試したこと:

クラス MaxHeap の Priority キューを使用しようとしましたが、うまくいきません。 これがこの問題を解決する最も簡単な方法だと思いますが、よくわかりません。

解決策 2

私たちは立ち往生している人々を喜んで助けますが、それは私たちがあなたのためにすべてをするためにここにいるという意味ではありません! 私たちがすべての作業を行うことはできません。あなたはこれに対して報酬を受け取っているか、またはそれはあなたの成績の一部であり、私たちがあなたのためにすべてを行うことはまったく公平ではありません.

だから私たちはあなたが仕事をする必要があり、あなたが行き詰まったときにあなたを助けます. それは、あなたが提出できる段階的な解決策を提供するという意味ではありません!
現在の状況と、プロセスの次のステップを説明することから始めます。 次に、その次のステップを機能させるために何を試みたか、またその際に何が起こったかを教えてください。

そして、あなたが私たちに示したコードは、質問が求めていることを何もしません…

開始するのに問題がある場合は、これが役立つ場合があります。 問題を解決するためのコードの書き方、初心者向けガイド[^]

コメント

タイトルとURLをコピーしました