有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将字符串与linkedlist中的字符串进行比较,并将结果作为布尔值插入mysql表

我有一个表“MoviesInfo”,其中包含以下字段:电影ID、动作、犯罪、戏剧、喜剧、恐怖、动画、纪录片等等

我需要将通过爬网获得的字符串(电影类型)与包含所有类型的列表进行比较,如果该字符串在列表中,则在关联的类型列中插入“1”。例如,电影《黑暗骑士》的类型有“动作”、“犯罪”、“戏剧”。因此,我想在“动作”、“犯罪”、“戏剧”列中插入“1”,在其他列中插入“0”

这是我的代码的一部分,我从中获得了电影类型:

  List<String> genre = new ArrayList<String>();
  .........
  Elements elms1 = doc.select("div.infobar");   
  Elements links1 = elms1.select("a[href]");
  for(Element link1 : links1){
      if(link1.attr("href").contains("/genre/"))
       {
            genre.add(link1.text());
        }
   }

   .....
   .....
   try{
    String query = "INSERT into moviesInfo (movieId, genre)" + "VALUES (?, ?)";
        PreparedStatement preparedStmt = conn.prepareStatement(query);
        preparedStmt.setString (1, ImdbID);
        preparedStmt.setString (2, genre.toString());
        preparedStmt.executeUpdate();
   }catch (Exception e)
    {
      System.err.println("Got an exception!");
      System.err.println(e.getMessage()); 
    }

我希望我能澄清我的问题,所有的想法都受到高度赞赏


共 (3) 个答案

  1. # 1 楼答案

    当一个项目有不同的过滤类别时,有不同的策略来处理这种情况

    添加列

    每个类别在数据表中表示为附加列,值为0或1表示匹配

    通过添加关系

    您创建了一个具有mamy to many关系的表,其中存储了项与类别的关系

    通过添加遮罩

    建立一个称为mask的二进制值,其中每个位置对应于类别

    科幻喜剧的面具是科幻喜剧的面具,戏剧的面具是科幻喜剧的面具

    通过添加非规范化

    您只需将值存储在单个列中,并用分隔符分隔它们。使用regexp可以确定该项应用于此类类别


    每种方法都有优缺点。在选择方法之前,有各种各样的权衡,我很可能在将来不得不改变

    因此,与其关注givedb策略,不如选择其中一种。并在应用程序中为其创建一个简单的API。电影与类别匹配的逻辑不应该公开,所以你可以很快改变它

    public Collection<Movie> findByCategories(Category... categories)这是最终产品

    什么是{}和{}

    类别代表描述电影性别的简单对象

    class Category {
    
     private final String name; 
    
     public Category(String name) {
        this.name = name;
     }
    
     public String name() {
        return this.name;
     }
    
      //Override equals and hashCode
    }
    

    电影代表了电影,所以在它的结构中我们应该有一些属性

    class Movie {
      private final String title;
      private final byte   year;
      private Collection<Category> categories;
    
      public Movie(String title, byte year) {
         this.title = title;
         this.year  = year;
      }
    
      public boolean isCategory(Category category) {
         if(categories == null) reuturn false;
    
         return categories.contains(category);
      }
    }
    

    class Movie {
      private final String title;
      private final byte   year;
      private String categories;
    
      public Movie(String title, byte year) {
         this.title = title;
         this.year  = year;
      }
    
      public boolean isCategory(Category category) {
         if(categories == null) reuturn false;
    
         return categories.contains(category.name());
      }
    
    }
    
  2. # 2 楼答案

    终于,我可以解决我的问题了。我不得不使用linkedList和LinkedHashMap来存储流派。(我使用linkedHashMap而不是HashMap来保持顺序)。这是一个运行良好的新代码:

         LinkedList<String> genres = new LinkedList<String>();
            genres.add("Action");
            genres.add("Adventure");
            genres.add("Comedy");
            genres.add("Animation");
            genres.add( "Drama");
            genres.add("Romance");
            .
            .
            .
    
         LinkedHashMap<String,Integer> currentGenreHashMap = new LinkedHashMap<String, Integer>();
         String baseUrl = "http://www.imdb.com/title/"+ImdbID;
    
                try {
                   org.jsoup.Connection con = Jsoup.connect(baseUrl).userAgent("Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.21 (KHTML, like Gecko) Chrome/19.0.1042.0 Safari/535.21");
                  ....
                  ..
                       Elements elms1 = doc.select("div.infobar");  
                        Elements links1 = elms1.select("a[href]");
                        LinkedList<String> currentGenres = new LinkedList<String>();
    
    
                       for (String g1 : genres){
                            currentGenreHashMap.put(g1, 0);
                        } //set the default to zero
    
    
                        for(Element link1 : links1){
                            if(link1.attr("href").contains("/genre/"))
                            {
                                currentGenres.add(link1.text());
                                System.out.println("generi: " + link1.text());
                            }
                        }
    
                        for (String genere : genres){
                            if (currentGenres.contains(genere))
                                currentGenreHashMap.put(genere, 1);
    
                            } //here I compare the genre that I get by crawler to the genres in the list and when they were equal it set it to '1'
                            System.out.println("movie genres:" + currentGenreHashMap);
                              ...
                              ...
                         try{
                            String query = "INSERT into moviesInfo (movieImdbId, Action, Adventure, Comedy, Animation, Drama, Romance, Family, Fantasy, Crime, Biography, Documentary, FilmNoir, Horror, War, History, Western, Musical, SciFi, Mystery, Thriller, RealityTV, TalkShow, GameShow, Short, Music, Sport, News, Adult, Lifestyle, Experimental, Commercial, country, trailerLink, storyline, posterLink)" + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";
                            PreparedStatement preparedStmt = conn.prepareStatement(query);
                            preparedStmt.setString (1, ImdbID);
                            int count = 2;
                            for (String g1 : currentGenreHashMap.keySet()){
    
                                preparedStmt.setString (count, currentGenreHashMap.get(g1).toString());
                                count++;
                            }
                          preparedStmt.executeUpdate();
    
                        }catch (Exception e)
                        {
                            System.err.println("Got an exception!");
                            System.err.println(e.getMessage()); 
                        }
    
  3. # 3 楼答案

    您可能需要一个DTO(数据传输对象),您可以使用它来将类型转换为


    DTO:

    public class Genre {
       //Create boolean field values for all genre and initialize to false in constructor
       //Attributes and name
       //Create getters/setters for all field values
    }
    

    填充DTO:

      for(Element link1 : links1){
          if(link1.attr("href").contains("/genre/"))
           {
                String genre_name = link1.text()
                Genre genre = new Genre();                
    
                if(genre_name.equals("Comedy") {
                   genre.setComedy(Boolean.TRUE);
                }
    
                if(genre_name.equals("Horror") {
                   genre.setHorror(Boolean.TRUE);
                }
    
                //Repeat for all genre...
    
                //Add genre DTO to database
           }
       }
    

    现在,当您将此流派添加到数据库中时,只需将流派为true的时间设置为“1”