【问题标题】:How to find different genre then add to arrayed linked list如何找到不同的流派然后添加到数组链表
【发布时间】:2016-03-02 07:47:55
【问题描述】:

我正在尝试从电影文件中获取流派,然后检查流派是否相同。所以如果文件中有相同类型的电影,它们应该存储在相同的链接列表数组中。

我需要检查流派的哈希码,然后找出文件中是否有任何其他电影哈希流派的相同哈希码,然后将该特定流派放入链接列表中。所以基本上我到目前为止有这个,我也有一个链接列表类等,而不是使用 java.util

public class LoadingMovies {

    private static final int size = 22;
    private static HashMap<String, Movies> hash = new HashMap(size);
    private static HashEntry<String, Movies> hasher = new HashEntry();
    private static List<Movies> linked = new List<>();

    public static void loadMovies(String filename) throws FileNotFoundException {
        String split = ","; //split with comma

        Scanner in = new Scanner(new File(filename));

        ArrayList<String> arraylist = new ArrayList<>();
        String wordIn;
        Movies movie = new Movies();

        while (in.hasNextLine()) {
            wordIn = in.nextLine();
            String splitter[] = wordIn.split(split);

            String movieTitle = splitter[0];
            String movieGenre = splitter[1];
            String ageRating = splitter[2];
            double scoreRating = Double.parseDouble(splitter[3]);

            movie.setTitle(movieTitle);
            movie.setGenre(movieGenre);
            movie.setAgeRating(ageRating);
            movie.setScoreRating(scoreRating);
            //System.out.println(movie.getGenre());
              arraylist.add(movie.getGenre);
//            hash.find(movie.getGenre().hashCode());
//            hash.insert(movie.getGenre().hashCode(), movie);
        }



      }
}

这是我到目前为止所拥有的。我已经读入了文件,现在我想检查文件中的流派(字符串)是否相同,然后将该流派添加到链接列表中。我该怎么做?

【问题讨论】:

  • 您能否说明您的预期输出是什么?从一个流派到一个电影列表的映射?
  • @Mureinik 是的。因此,如果我搜索特定流派或想要检查重复次数最多的流派,它将转到拥有更多流派的位置。所以我的输出应该是:例如,如果类型相同,则哈希入口键将相同,然后打印出电影

标签: java arrays linked-list hashmap hashtable


【解决方案1】:

HashMap&lt;String, List&lt;Movie&gt;&gt; 似乎就是您要找的东西:

Map<String, List<Movie>> movieGenres = new HashMap<>();
while (in.hasNextLine()) {
    // code you have

    List<Movie> moviesInThisGenre = moviewGenres.get(genre);
    if (moviesInThisGenre == null) {
        moviesInThisGenre = new LinkedList<>();
        movieGenres.put(genre, moviesInThisGenre);
    }
    moviesInThisGenre.add(movie);
}

【讨论】:

  • 我在运行它时得到这个输出:'线程“main”中的异常 java.lang.ArithmeticException: / TheMoviePackage.LoadingMovies 的 TheMoviePackage.HashMap.find(HashMap.java:52) 处的异常为零.loadMovies(LoadingMovies.java:50) 在 TheMoviePackage.LoadingMovies.main(LoadingMovies.java:87) Java 结果:1'
  • 这就是我改变它的方式。 movie.setTitle(movieTitle); movie.setGenre(movieGenre); movie.setAgeRating(ageRating); movie.setScoreRating(scoreRating); List&lt;Movies&gt; moviesInThisGenre = movieGenres.find(movieGenre); if (moviesInThisGenre == null) { moviesInThisGenre = new List&lt;&gt;(); movieGenres.insert(movieGenre, moviesInThisGenre); } ListIterator&lt;Movies&gt; iter = moviesInThisGenre.getIterator(); moviesInThisGenre.add(iter, movie);
【解决方案2】:

您需要一个从流派字符串映射到电影列表的地图:

HashMap<String, List<Movies>> genres = new Hash...

那么当你添加电影时:

String g = movie.getGenre();
if (!genres.containsKey(g)
    genres.put(g, new ArrayList<Movies>));
genres.get(g).add(movie);

说明 HashMap 存储关键对象的值,其中每个关键对象在映射中只能出现一次。因此,当您想为一种流派 String 存储多部电影时,值类型应该是一个集合(List、Set 等)。 例如

HashMap<String, Movies> genres ... ;
...
genres.put(g, movie);

将覆盖您之前对该类型的任何 Movie 值。

但是,由于您无法在运行时知道该类型是否已存在于您的地图中,因此您必须为未知类型添加一个新(空)列表。现在可以将具有该类型的任何电影添加到该列表中。

【讨论】:

  • 你能解释一下吗。我还不能正确理解哈希图等,只是在尝试。刚开始学。
  • 添加了一些解释,更多,还有很多,例如:howtodoinjava.com/2012/10/09/how-hashmap-works-in-java
  • -我仍然收到Exception in thread "main" java.lang.ArithmeticException: / by zero at TheMoviePackage.HashMap.find(HashMap.java:52) at TheMoviePackage.LoadingMovies.loadMovies(LoadingMovies.java:50) at TheMoviePackage.LoadingMovies.main(LoadingMovies.java:66) Java Result: 1
  • 它指向我的查找密钥方法,这是public DataType find(KeyType key){ int hash = key.hashCode() % size; List&lt;HashEntry&lt;KeyType,DataType&gt;&gt; list = table[hash]; ListIterator &lt;HashEntry&lt;KeyType, DataType&gt;&gt; iter = list.getIterator(); while(iter.isValid()){ if(iter.item().getKey().equals(key)){ return iter.item().getData(); } iter.advance(); } return null; } 有什么问题吗?
猜你喜欢
  • 1970-01-01
  • 2016-03-02
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
相关资源
最近更新 更多