Java 排序数组列表<;对象[]>;按列
我对Java和面向对象编程非常陌生。我正在尝试对对象的二维排列进行排序。目前,我的代码读取一个CSV文件,并将每一行放入一个新对象中,每个对象都有6个与该文件相关的值 这是我的密码:Java 排序数组列表<;对象[]>;按列,java,arrays,sorting,arraylist,multidimensional-array,Java,Arrays,Sorting,Arraylist,Multidimensional Array,我对Java和面向对象编程非常陌生。我正在尝试对对象的二维排列进行排序。目前,我的代码读取一个CSV文件,并将每一行放入一个新对象中,每个对象都有6个与该文件相关的值 这是我的密码: publicstaticvoidreadfile(){ 字符串行=”; 试一试{ BufferedReader br=新的BufferedReader(新文件读取器(Main.filepath)); 而((line=br.readLine())!=null){ 字符串值[]=line.split(“,(?=([^\
publicstaticvoidreadfile(){
字符串行=”;
试一试{
BufferedReader br=新的BufferedReader(新文件读取器(Main.filepath));
而((line=br.readLine())!=null){
字符串值[]=line.split(“,(?=([^\“]*\”[^\“]*\”*[^\“]*$”)”);
字符串filmName=值[0];
int filmYear=Integer.parseInt(值[1]);
字符串filmRating=值[2];
字符串filmGenre=值[3];
int filmLength=Integer.parseInt(值[4]);
double filmScore=double.parseDouble(值[5]);
对象[]电影={filmName,filmYear,filmRating,film流派,filmLength,filmScore};
添加(胶片);
}
}捕获(例外情况除外){
System.out.println(“未找到文件”);
}
}
我知道声明每个变量最终都是不必要的,但是这让我更容易理解
我想使用
.sort()
按filmLength
变量对数组进行排序,但我不确定如何排序。根据面向对象编程的原则,您应该创建一个Film
类,该类可以存储所有六个属性。您可以实现compariable
来定义排序顺序
public class Film implements Comparable<Film>{
private final String filmName, filmRating, filmGenre;
private final int filmYear, filmLength;
private final double filmScore;
public Film(final String filmName, final int filmYear, final String filmRating, final String filmGenre, final int filmLength, final double filmScore){
this.filmName = filmName;
this.filmYear = filmYear;
this.filmRating = filmRating;
this.filmGenre = filmGenre;
this.filmLength = filmLength;
this.filmScore = filmScore;
}
@Override
public int compareTo(final Film o){
return Integer.compare(this.filmLength, o.filmLength);
}
}
您可以使用该方法,并将一系列比较器传递给它,这些比较器按照特定的顺序和方向按特定的字段对列表进行排序
//准备数组列表
对象[]film1={“filmName2”,1981年,“filmRating1”,“filmGenre3”,165,5.4D};
对象[]film2={“filmName5”,1982,“filmRating2”,“filmGenre5”,163,5.5D};
对象[]film3={“filmName1”,1983年,“filmRating3”,“filmGenre4”,163,5.1D};
对象[]film4={“filmName4”,1984年,“filmRating4”,“filmGenre2”,161,5.2D};
对象[]film5={“filmName3”,1985,“filmRating5”,“filmGenre1”,162,5.3D};
对象[]film6={“filmName3”,1980年,“filmRating5”,“filmGenre1”,162,5.3D};
对象[]film7={“filmName3”,1980年,“filmRating5”,“filmGenre1”,162,5.0D};
对象[]film8={“filmName2”,1979年,“filmRating1”,“filmGenre3”,165,5.4D};
列出文件数据=
阵列。asList(电影7、电影1、电影3、电影2、电影8、电影5、电影4、电影6);
//使用比较器链对列表进行排序。
//在这种情况下,您应该将字段强制转换为其实际类型。
排序(比较器)
.comparing(e->(String)((Object[])e)[0],Comparator.reverseOrder()
.然后比较(e->(double)((Object[])e)[5])
.然后比较(e->(int)((Object[])e[1]);
//逐行打印列表
fileData.stream().map(Arrays::toString).forEach(System.out::println);
//[FilmName51982,filmRating2,FilmGenre51635.5]
//[FilmName41984,filmRating4,FilmGenre2161,5.2]
//[filmName3,1980,filmRating5,FilmGenre11262,5.0]
//[filmName3,1980,filmRating5,filmGenre1,162,5.3]
//[filmName3,1985,filmRating5,filmGenre1,162,5.3]
//[FilmName219979,filmRating1,FilmGenre31655.4]
//[FilmName21981,filmRating1,FilmGenre31655.4]
//[FilmName11983,filmRating3,FilmGenre41635.1]
这是否回答了您的问题?请注意。虽然您当前的数据结构并没有使此任务无法完成,但如果您创建了一个自定义类Film
,其中每个对象都保存了一部电影的数据(名称、年份等),这将变得更加容易。使用对象数组结构,您将失去java等语言提供的许多类型安全性。我将如何创建该Film类?我不知道如何使用面向对象,您能否重新找到任何可能有用的资源?
BufferedReader br = new BufferedReader(new FileReader(Main.filepath));
final List<Film> films = new ArrayList<>();
while ((line = br.readLine()) != null) {
String values[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
String filmName = values[0];
int filmYear = Integer.parseInt(values[1]);
String filmRating = values[2];
String filmGenre = values[3];
int filmLength = Integer.parseInt(values[4]);
double filmScore = Double.parseDouble(values[5]);
films.add(new Film(filmName, filmYear, filmRating, filmGenre, filmLength, filmScore));
}
Collections.sort(films);//sort