Как я могу реализовать эту функцию? - PullRequest
3 голосов
/ 25 мая 2010

Я новичок и хочу написать код Java в Eclipse. Эта программа принимает два LinkedList целых числа (например, a и b) и создает LinkedList (например, d), в котором каждый элемент является суммой элементов из a и b. Однако я не могу добавить эти два элемента из a и b, потому что они являются объектами

Пример:

a=[3,4,6,7,8]
b=[4,3,7,5,3,2,1]
------
d=[7,7,13,12,11,2,1]

Ответы [ 6 ]

12 голосов
/ 25 мая 2010

Я предполагаю, что вы определяете LinkedLists как:

LinkedList a, b;

, в этом случае a.get() вернет Object. Java поддерживает универсальные , которые позволяют вам:

LinkedList<Integer> a, b;

Теперь a.get() вернет Integer вместо Object. Вы можете сказать, что LinkedList является универсальным, потому что заголовок javadoc показывает «Class LinkedList<E>» - E является универсальным типом. Определение get() равно public E get(int index) - поскольку его тип возвращаемого значения равен E, то, что вы указали для универсального типа LinkedList, будет типом, возвращаемым этим методом.

Аналогично, подпись метода add() равна public boolean add(E o), поэтому он будет принимать только целые числа в качестве аргументов и завершится неудачно во время компиляции, если вы попытаетесь добавить неправильный тип.

// This is fine
LinkedList a;
a.add(1);
a.add("foo");

// This will fail
LinkedList<Integer> a;
a.add("foo");
4 голосов
/ 25 мая 2010

Вам нужно использовать обобщенные элементы, чтобы сообщить компилятору, что в списках есть целые числа

List<Integer> a = new LinkedList<Integer>();
1 голос
/ 26 мая 2010

Я думаю, что у вас проблемы:

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

Object o1=object1FromTheList;
Integer integer1=(Integer)o1;

Object o2=object2FromTheList;
Integer integer2=(Integer)o2;

Теперь, если ваша проблема состоит в том, чтобы вычислять значения из них, например (вы получаете ошибку компиляции):

int sum=integer1+integer2;

это означает, что ваш компилятор имеет более старую версию, чем 1.5, которая не поддерживает автобокс,автоматическая распаковка:

автобокс позволяет простую реализацию кода для преобразования:

Целое число -> примитив int

Long -> примитив long

...

..

и т. Д. Вот так!

Основные моменты:

без автобокса вы должны написать:

Integer five=new Integer(5); // very annoying to write this as it is isn't it

автобокс позволяет написать это так:

Integer five=5; // nicer shorter and easy to understand

без автобоксараспаковывая, вам нужно написать:

Integer six=new Integer(6); // no auto-boxing
int _six=six.getValue(); // no auto-unboxing if you have to do some computation this could be hell

автоматическая распаковка позволяет написать это так:

Integer six=6; // with auto-boxing
int _six=six; // with auto-unboxing much nicer

надеюсь, это поможет

Адам.

1 голос
/ 25 мая 2010

Я предполагаю, что это домашнее задание. Я дам вам некоторый код, но я надеюсь, что вы научитесь этому вместо копирования и вставки ... Люди, кажется, думают, что это неправильно, но в моей книге, если вы недостаточно умны, чтобы учиться на готовом коде и просто копировать и вставлять в конце концов, это покажет, что вы ничему не научились.

Когда я начинал, мне нравилось иметь ответы на проблемы, с которыми я столкнулся после того, как попробовал их самостоятельно. Я многому научился, надеюсь, вы тоже.

В основном, как уже говорили другие люди, решение состоит в том, чтобы объявить ваш список как общий целочисленный список:

import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;


/**
 * @author Savvas Dalkitsis
 */
public class Test {

    public static void main(String[] args) {
        List<Integer> one = Arrays.asList(new Integer[] {3,4,6,7,8});
        List<Integer> two = Arrays.asList(new Integer[] {4,3,7,5,3,2,1});
        List<Integer> add = addLists(one, two);
        printList(one);
        printList(two);
        printList(add);
    }

    public static List<Integer> addLists(List<Integer> a, List<Integer> b) {
        List<Integer> r = new LinkedList<Integer>();
        Iterator<Integer> it = a.iterator();
        for (Integer i: b) {
            r.add(i+(it.hasNext()?it.next():0));
        }
        while (it.hasNext()) {
            r.add(it.next());
        }
        return r;
    }

    public static void printList(List<?> list) {
        for (Object o : list) {
            System.out.print(o.toString()+" , ");
        }
        System.out.println();
    }

}
1 голос
/ 25 мая 2010

Это домашняя работа? Если это так, я не дам вам готовый код, но укажу вам правильное направление.

Чтобы создать список в Java, вы должны сделать что-то вроде этого:

List<Integer> list = new ArrayList<Integer>();

Затем вы добавили бы элементы в список, вызвав list.add(Integer)

Затем вы можете перебрать List следующим образом:

Integer sum = new Integer(0);
for(Integer i : list)
{
    sum+=i;
}

Соберите их вместе и добавьте еще один список, и у вас есть ответ ...

1 голос
/ 25 мая 2010

Если вы не можете изменить тип используемого списка, введите в Google слова java typecast.

Если у вас есть контроль над типом списка, используйте дженерики, как уже упоминали другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...