Я пытаюсь создать программу, которая создает ArrayList, учитывая тип, а также значения, которые будут помещены в ArrayList. Структура ввода, с которой нам нужно работать, это «I 6 7 5 3 1 -1 2», где I - это тип Integer (или S для String и т. Д.), А первое число (6) - это количество значений в ArrayList . Я не уверен, как создать экземпляр ArrayList.

public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    String type = scan.next();
    int length = scan.nextInt();
    int counter = 0;

    if (type.equals("I")) {
        ArrayList<Integer> A = new ArrayList<Integer>;
    }
    else if (type.equals("S")) {
        ArrayList<String> A = new ArrayList<String>;
    }
    else if (type.equals("D")) {
        ArrayList<Double> A = new ArrayList<Double>;
    }
    else {
        System.out.println("Invalid type");
    }

    while (scan.hasNext() && counter<length) {
        String s1 = scan.next();
        A.add(s1);
        counter += 1;
    }

    System.out.print(A);
}

//Removes any duplicate values in the arraylist by checking each value after it
public static <E> ArrayList<E> removeDuplicates(ArrayList<E> list) {
    ArrayList<E> inArray = list;
    for (int i = 0; i<inArray.size(); i++) {
        for (int j = i+1; j<inArray.size(); j++) {
            if (inArray.get(i) == inArray.get(j)) {
                inArray.remove(j);
            }
        }
    }
    return inArray;
}

//Shuffles the contents of the array
public static <E> void shuffle(ArrayList<E> list) {
    E temp;
    int index;
    Random random = new Random();
    for (int i = list.size()-1; i > 0; i--) {
        index = random.nextInt(i + 1);
        temp = list.get(index);
        list.set(index, list.get(i));
        list.set(i, temp);
    }
    System.out.print(list);
    return;
}

//Returns the largest element in the given arraylist
public static <E extends Comparable<E>> E max(ArrayList<E> list) {
    E max = Collections.max(list);
    System.out.println(max);
    return max;
}
-2
Josh Correia 25 Апр 2017 в 02:29

2 ответа

Лучший ответ

Я не могу в хорошем сознании дать вам ответ, который вы хотите, но скорее я дам вам ответ, который вам нужен.

НЕ ДЕЛАЙТЕ ЭТОГО!

Это не имеет смысла вообще. Стирание типа данных во время компиляции генериков приводит к тому, что ArrayList<Whatever> действует как ArrayList<?>. Вы не можете определить универсальный тип во время выполнения, если вы не проверите проверку элементов внутри ArrayList

С таким же успехом вы могли бы написать этот код, он даст вам такие же точные результаты:

public static ArrayList<?> returnProper(String type) {
    if(type.length() == 1 && "ISD".contains(type)) {
        return new ArrayList();
    } else {
        System.out.println("Invalid type");
        return null;
    }
}

ТАК, ПОЖАЛУЙСТА, НЕ ДЕЛАЙТЕ ЭТОГО

4
EyuelDK 25 Апр 2017 в 00:07

Заменить второй E на "?" и затем исправьте метод для возврата.

public static <T> ArrayList<?> returnProper(String type) {
    if (type.equals("I")) {
        return new ArrayList<Integer>();
    } else if (type.equals("S")) {
        return new ArrayList<String>();
    } else if (type.equals("D")) {
        return new ArrayList<Double>();
    } else {
        System.out.println("Invalid type");
    }

    return null;
}
1
mhradek 24 Апр 2017 в 23:50