Arraylist в Arraylist, непроверенная ошибка. Джава
Я пытаюсь поместить arraylists в arraylist. Добавляем данные в новые массивы, затем распечатываем их по порядку. Я только получаю ошибки.
Является ли это правильным способом создания массива в другом массиве с использованием цикла for?
Я также хотел бы узнать, как я могу получить данные из массива лучше, чем эти длинные выражения.
Мои ошибки
jogging.java:101: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.ArrayList
res.get(iter).add(new Resultat(name,time));
jogging.java:152: warning: [unchecked] unchecked conversion found : java.util.ArrayList required: java.util.List<T> Collections.sort(res.get(iter2));
jogging.java:152: warning: [unchecked] unchecked method invocation: <T>sort(java.util.List<T>) in java.util.Collections is applied to (java.util.ArrayList)
Collections.sort(res.get(iter2));
импорт java.util. ;
импорт java.lang.;
class Resultat implements Comparable<Resultat> {
String namn;
double tid;
public Resultat( String n, double t ) {
namn = n;
tid = t;
}
public String toString()
{
return namn + " "+ tid;
}
public int compareTo( Resultat r ) {
if (this.tid < r.tid){
return -1;
}
else if (this.tid > r.tid){
return 1;
}
else if (this.tid == r.tid && this.namn.compareTo(r.namn) <= 0)
{
return -1;
}
else if ( this.tid == r.tid && this.namn.compareTo(r.namn) >= 0){
return 1;
}
else {return 0;}
}
}
public class jogging {
public static void main( String[] args ){
int runners = scan.nextInt();
int competitions = scan.nextInt();
//create arraylist with arraylists within
ArrayList <ArrayList> res = new ArrayList<ArrayList>();
for(int i = 0; i <= competitions; ++i){
res.add(new ArrayList<Resultat>());
}
for (int i = 0; i < runners; i++){
String name = scan.next();
//runs the person made
int antalruns = scan.nextInt();
for(int n = 0; n <antalruns; n++){
//number of the run
int compnumber = scan.nextInt();
//time for the run
double time = scan.nextDouble();
for(int iter = 0; iter < res.size(); ++iter){
res.get(iter).add(new Resultat(name,time));
}
}
}
for(int iter2 = 0; iter2 < res.size(); ++iter2) {
Collections.sort(res.get(iter2));
System.out.println(iter2);
for(int it = 0; it < res.get(iter2).size(); ++it) {
System.out.println(res.get(iter2).get(it));
}
}
}
}
2 ответа
Непроверенные предупреждения вызваны тем, что вы не объявили универсальные типы 2-го ArrayList. Попробуйте использовать
ArrayList <ArrayList<Resultat>> res = new ArrayList<ArrayList<Resultat>>();
Да, это немного утомительно.:-(
Кроме того, большинство считает целесообразным использовать интерфейс (например, List, а не ArrayList) на левой стороне, на случай, если вы передумаете относительно реализации в будущем. например
List <List<Resultat>> res = new ArrayList<ArrayList<Resultat>>();
ADDED
Кроме того, вы можете упростить ваш метод CompareTo(). Для сравнения приливов, посмотрите на Double.compare(). Что-то вроде:
public int compareTo( Resultat r ) {
int compare = Double.compare(tid, r.tod);
if (compare != 0)
return compare;
else
return namn.compareTo(r.namn);
}
Каждый раз, когда вы создаете ArrayLIst, вам нужно объявить его тип данных. Поэтому, когда вы создаете ArrayLIst внутри ArrayList, вам нужно написать:
ArrayList<ArrayList<Resultat>> res = new ArrayList<ArrayList<Resultat>>();
Также компилятор должен приложить меньше усилий, если вы напишите:
import java.util.ArrayList; // NOT: import java.util.*;
Имя класса, начинающееся с upperCase, является соглашением по именованию Java. Поэтому всегда полезно писать имя класса следующим образом:
public class Jogging {
/..
}