2016-11-24 5 views
0

私はJava言語を学んでおり、人気の高い情報をデータベースから取得してソートすることができます。ソート対象の配列に指定された値に基づいて、2D配列の最初の要素を並べ替えます。

これまでのところ、私はString型[20] [6]の次の2次元配列を持っています。文字列の数を20スタンド[]のような6は、各映画の変数に対応しながら、映画を代表する内部配列、:

[0] - path of image for the movie; 
[1] - overview of the movie; 
[2] - release date of the movie; 
[3] - title of the movie; 
[4] - popularity (expressed in a double format) of the movie; 
[5] - average rating (expressed in a double format) of the movie. 

私はそれが映画のシーケンスとなるようにしたい[20]データを変更することなく、人気が降順になるようにします。コンパイラなどについて読んだことがあります。ちょうど詰まって、正しく適用する方法を見つけようとしています。

これは、最も人気のあるムービーのイメージをgridViewに取り込み、これらのムービーを人気度または平均投票数でソートする機能を実装したいと考えています(現在、データベースが提供するシーケンス)。

ありがとうございます。

答えて

1

より良いソートアルゴリズムを簡単に適用できるように、私はList<Movie>のようなデータ構造を好むでしょう。その場合、javaのネイティブ(効率的な)ソートアルゴリズムを使用する

Collections.sort(movies, new PopularityComparator()); 

のようなものを持つことができます。 PopularityComparatorはこのような何か(getPopularity()戻りDoubleを想定)

public class PopularityComparator implements Comparator<Movie> { 
@Override 
public int compare(Movie m1, Movie m2) { 
    return Double.compare(m2.getPopularity(), m1.getPopularity()); 
} 
} 

しかし、厳密に質問について話すことができ、私は以下のコードは、あなたのために働くべきだと思います。

for (int i = 0; i < movies.length; i++) { 
     for (int j = i; i < movies.length; j++) { 
      if (Double.compare(Double.parseDouble(movies[i][4]), Double.parseDouble(movies[j][4])) >= 0) { 
       //swap movies[i] and movies[j] 
       String[] temp = movies[i]; 
       movies[i] = movies[j]; 
       movies[j] = temp; 
      } 
     } 
    } 
+0

質問に回答し、良い習慣についても説明します。いい答え! – shalafi

+0

まず最初はすごくお返事いただきありがとうございます。あなたの方法は本当に私のためのトリックでしたが、今はすべてがスムーズに実行されます。これを正解と評価してください! (コンパレータも見やすくなりました:)) – Mikas

+0

@Mikasは喜んでお手伝いします:) –

0
for (int i = 0; i < 20; i++) { 
     for (int j = 0; j < 19; j++) { 
      if(movies[i][4]>movies[j][4]){ 
       // swap movies[i] & movies[j] 
      } 
     } 
    } 

このコードを使用してください。お手伝いをしてください。

+0

こんにちは、このような短い予告にお返事いただきありがとうございます!私はあなたのコードを実装しようとしましたが、行を2回ソートすると何とか頭がおかしくなります。ありがとう、結構です! – Mikas

0

私はJavaでオブジェクトを操作する方がよいと思います(私はコードを見たとき、私はより簡単に私がやってみたかったかを把握することができます)と、あなたは多次元文字列配列に変換する必要がある場合よりも。 2つのソリューションを見て、まずあなたが望むものと、私が示唆しているものを見てください。それがあなたを助けることを願ってください。

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 

/** 
* 
* @author Adrian Stefanovski 
*/ 
public class StackOverflow { 

    public static String[][] sorting_array = new String[20][6]; 
    public static int max_popularity = 10; 
    public static int max_rating = 10; 
    public static ArrayList<MovieSomething> sorting_array_list = new ArrayList<>(); 

    public static void main(String[] args) { 
     //Solution 1 
     populate_array(); 
     print_not_sorted_array(); 
     sort_array(); 
     print_sorted_array(); 
     //Solution 2 
     populate_array(); //Use diferent values 
     populate_array_list(); 
     print_not_sorted_array_list(); 
     sort_array_list(); 
     print_sorted_array_list(); 
     to_multi_d_string_array(); 
    } 

    public static void populate_array() { 
     for (int i = 0; i < 20; i++) { 
      sorting_array[i][0] = "path " + i; 
      sorting_array[i][1] = "overview " + i; 
      sorting_array[i][2] = "release date " + i; 
      sorting_array[i][3] = "title " + i; 
      sorting_array[i][4] = String.valueOf(Math.random() * max_popularity); //popularity 
      sorting_array[i][5] = String.valueOf(Math.random() * max_rating); //average rating 
     } 
    } 

    public static void print_not_sorted_array() { 
     System.out.println("Without sorting array"); 
     for (int i = 0; i < 20; i++) { 
      System.out.println(sorting_array[i][0] + " " + sorting_array[i][1] + " " + sorting_array[i][2] + " " + sorting_array[i][3] + " " + sorting_array[i][4] + " " + sorting_array[i][5]); 
     } 
    } 

    public static void sort_array() { 
     for (int i = 0; i < 20; i++) { 
      for (int j = i + 1; j < 20; j++) { 
       if (Double.valueOf(sorting_array[i][4]) < Double.valueOf(sorting_array[j][4])) { 
        rotate_members(i, j); 
       } 
      } 
     } 
    } 

    public static void rotate_members(int i, int j) { 
     String temp_column_0 = sorting_array[i][0]; 
     String temp_column_1 = sorting_array[i][1]; 
     String temp_column_2 = sorting_array[i][2]; 
     String temp_column_3 = sorting_array[i][3]; 
     String temp_column_4 = sorting_array[i][4]; 
     String temp_column_5 = sorting_array[i][5]; 
     sorting_array[i][0] = sorting_array[j][0]; 
     sorting_array[i][1] = sorting_array[j][1]; 
     sorting_array[i][2] = sorting_array[j][2]; 
     sorting_array[i][3] = sorting_array[j][3]; 
     sorting_array[i][4] = sorting_array[j][4]; 
     sorting_array[i][5] = sorting_array[j][5]; 
     sorting_array[j][0] = temp_column_0; 
     sorting_array[j][1] = temp_column_1; 
     sorting_array[j][2] = temp_column_2; 
     sorting_array[j][3] = temp_column_3; 
     sorting_array[j][4] = temp_column_4; 
     sorting_array[j][5] = temp_column_5; 
    } 

    public static void print_sorted_array() { 
     System.out.println("With sorting array"); 
     for (int i = 0; i < 20; i++) { 
      System.out.println(sorting_array[i][0] + " " + sorting_array[i][1] + " " + sorting_array[i][2] + " " + sorting_array[i][3] + " " + sorting_array[i][4] + " " + sorting_array[i][5]); 
     } 
    } 

    public static void populate_array_list() { 
     for (int i = 0; i < 20; i++) { 
      sorting_array_list.add(new MovieSomething(sorting_array[i][0], sorting_array[i][1], sorting_array[i][2], sorting_array[i][3], Double.valueOf(sorting_array[i][4]), Double.valueOf(sorting_array[i][5]))); 
     } 
    } 

    public static void print_not_sorted_array_list() { 
     System.out.println("Without sorting array list"); 
     sorting_array_list.stream().forEach((movie) -> { 
      System.out.println(movie.toString()); 
     }); 
    } 

    public static void sort_array_list() { 
     Collections.sort(sorting_array_list, new Comparator<MovieSomething>() { 
      @Override 
      public int compare(MovieSomething fruit2, MovieSomething fruit1) { 
       if (fruit1.popularity > fruit2.popularity) { 
        return 1; 
       } else { 
        return -1; 
       } 
      } 
     } 
     ); 
    } 

    public static void print_sorted_array_list() { 
     System.out.println("With sorting array list"); 
     sorting_array_list.stream().forEach((movie) -> { 
      System.out.println(movie.toString()); 
     }); 
    } 

    public static void to_multi_d_string_array() { 
     int i = 0; 
     for (MovieSomething movie : sorting_array_list) { 
      sorting_array[i][0] = movie.path; 
      sorting_array[i][1] = movie.overview; 
      sorting_array[i][2] = movie.release_date; 
      sorting_array[i][3] = movie.title; 
      sorting_array[i][4] = String.valueOf(movie.popularity); 
      sorting_array[i][5] = String.valueOf(movie.average_rating); 
      i += 1; 
     } 
    } 

    public static class MovieSomething { 

     public final String path; 
     public final String overview; 
     public final String release_date; 
     public final String title; 
     public final double popularity; 
     public final double average_rating; 

     public MovieSomething(String path, String overview, String release_date, String title, double popularity, double average_rating) { 
      this.path = path; 
      this.overview = overview; 
      this.release_date = release_date; 
      this.title = title; 
      this.popularity = popularity; 
      this.average_rating = average_rating; 
     } 

     @Override 
     public String toString() { 
      return "MovieSomething{" + "path=" + path + ", overview=" + overview + ", release_date=" + release_date + ", title=" + title + ", popularity=" + popularity + ", average_rating=" + average_rating + '}'; 
     } 
    } 

} 
+0

私の目にはこのような穏やかな操作のためのコードがあります。DIは努力をすばらしく評価しますが、私が正しく理解できないコードや私を混乱させるコードを使用したくないので、あなたが書いたすべてのものを並べ替えることができます。 – Mikas

+0

私はそれの90%を短縮し、明日投稿し、それを1つの機能にすることができます。何が必要なのか分からなかった。入力パラメータと戻り値はString [] []ですか? – AdrianES

+0

はい、既に私のためにもう一つの答えが働いていましたが、あなたの創造性を表現してください! – Mikas

関連する問題