2016-11-24 114 views
0

我正在學習Java語言,並且我有這個任務來根據它們的流行度來對電影進行排序,這些信息是從數據庫中檢索的信息。根據要排序的數組中提供的值對2D數組的第一個元素進行排序

到目前爲止,我有以下二維數組String [20] [6]。 20所代表的String []陣列內,其代表電影的數目,而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>,這樣可以很容易地應用更好的排序算法。在這種情況下,你可能會有類似於

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

它使用java的原生(高效)排序算法。 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] 
      } 
     } 
    } 

使用此code.Hope幫助你。

+0

嗨,謝謝你在這麼短的時間內回答!我嘗試着實現你的代碼,但是連續排序2次讓某事變得糟糕透頂,不知道是誰的頭腦。謝謝你! – Mikas

0

我覺得是更好,如果你必須將它們轉換成多維字符串數組在Java(當我看到我的代碼可以更容易地找出我想做的事)的對象,比上班。看看這兩種解決方案,首先是你想要的,第二我是我的建議。希望它可以幫助你。

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%,明天發佈,讓它成爲一個功能。我不知道你需要什麼。入口參數和返回值是否應該是String [] []? – AdrianES

+0

是的,雖然另一個答案已經爲我工作,隨時表達你的創造力! – Mikas

相關問題