Вопрос

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

Я на последней неделе программирования на Java, и у меня огромные трудности с изучением Java. Я прочитал все книги, но продолжаю зацикливаться на крошечных проблемках. Это все равно что пытаться построить карточный домик. Я знаю только о частях синтаксиса и об использовании, которое показывает книга. Когда я комбинирую вещи, я сталкиваюсь с ужасными препятствиями. Я часами пытаюсь разобраться с ними. Солнечные документы показывают только основные виды использования, которые, кажется, не помогают

Вот что я хотел бы:

Когда я что-то пробую, и это не работает, как следующие манипуляции со списком массивов, я хочу найти место или программу, которые могут показать примеры кода, например, добавление дополнительного экземпляра класса в arrayList. Где я могу кратко узнать об этом, не задавая ни одного вопроса или 2 за каждую синтаксическую ошибку? Где находится Google для Java? Есть ли программа, которая примет ваши ошибки и покажет, как их исправить (или предложит предложения)?

/tmp/jc_4083/Inventory.java:101: incompatible types
found   : RatedDVD[]
required: java.util.ArrayList
        dvdlist = temp;
                  ^
/tmp/jc_4083/Inventory.java:110: array required, but java.util.ArrayList found
            if (p != dvdlist[i]) {
                            ^
/tmp/jc_4083/Inventory.java:111: array required, but java.util.ArrayList found
                temp[i-adj] = dvdlist[i];
                                     ^
/tmp/jc_4083/Inventory.java:115: incompatible types
found   : RatedDVD[]
required: java.util.ArrayList
        dvdlist = temp;

Вот мой код для этого класса, если кто-то заинтересован посмотреть на него для меня:

//Contruct inv and allow for methods add, get, size, sort, and value
import java.util.*;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;

public class Inventory
{// class Inventory
    private ArrayList<RatedDVD> dvdlist;// declare dvdlist as ArrayList of RatedDVD
    private int numDVDs;

    public Inventory()
    {// method Inventory
        dvdlist = new ArrayList<RatedDVD>();

    }// end method

    // add & get
    public RatedDVD get(int i){return dvdlist.get(i);}// method get

    public void add(DVD d){
    dvdlist = dvdlist d;
    sort();
    }// method add

    public double value()
    {// method value
        double total = 0.0;
        for (int i = 0; i < dvdlist.size(); i++) 
        {// for every pass thru dvdlist add total
        // [DEBUG] consider enhanced for
            total += get(i).feeValue();
        }
        return total;
    }// end method value

    public void sort()
    {// method sort
    // [DEBUG] consider optimization
    int n = dvdlist.size();
        for (int search = 1; search < n; search++) 
        {// for do the following and increment till dvdlist has been searched
            for (int i = 0; i < n-search; i++) 
            {// for step through comparison for entire dvdlist
                if (dvdlist.get(i).getName().compareToIgnoreCase(dvdlist.get(i+1).getName()) > 0) 
                {// if swap necessary then swap
                    RatedDVD temp = dvdlist.get(i);
                    dvdlist.set(i,dvdlist.get(i+1));
                    dvdlist.set(i+1,temp);
                }// end if swap
            }// end for compareto
        }// end outer for
    }// end method sort

    public int size(){return dvdlist.size();}// method size

    public void save() {
        save(true);
    }

    // save it to C:\data\inventory.dat
    public void save(boolean saveagain) {
        try {
            BufferedWriter w = new BufferedWriter(new FileWriter("c:\\data\\inventory.dat"));
            for (int i = 0; i < size(); i++) {
                RatedDVD dvd = get(i);
                w.write( dvd.getItem() + "\n");
                w.write( dvd.getName() + "\n");
                w.write( dvd.getRating() + "\n");
                w.write( dvd.getUnits() + "\n");
                w.write( dvd.getPrice() + "\n");
                w.write( dvd.value() + "\n");
                w.write( dvd.fee() + "\n");
                w.write( dvd.feeValue() + "\n");
                w.newLine();
            }
            // total value of it
            //w.write( value() + "\n");
            w.close();
        } catch (Exception ex) {
            if (saveagain) {
                new File("c:\\data\\").mkdir(); // make file if doesn't exist
                save(false); 
            }
        }
    }

    public int search(String name) {
        for (int i = 0; i < size(); i++) { // check if name string is equal
            if (get(i).getName().equalsIgnoreCase(name)) return i;
        }
        return -1; // we didn't find anything
    }

    // add a new dvd to the end, increasing the array size
    public void add(RatedDVD p) {
        RatedDVD[] temp = new RatedDVD[dvdlist.size()+1];
        for (int i = 0; i < dvdlist.size(); i++) {
            temp[i] = dvdlist[i];
        }
        temp[temp.length-1] = p; // add it at the end
        dvdlist = temp;
    }

    // remove a DVD from the array, and shrink the array size
    public void delete(RatedDVD p) {
        RatedDVD[] temp = new RatedDVD[dvdlist.size()-1];
        int adj = 0;
        for (int i = 0; i < dvdlist.size(); i++) {
            if (p != dvdlist[i]) {
                temp[i-adj] = dvdlist[i];
            }
            else adj = 1;
        }
        dvdlist = temp;
    }
    public int highestNumber() {
        int numb = 0;
        for (int i = 0; i < dvdlist.size(); i++) {
            if (get(i).getItem() > numb) {
                numb = get(i).getItem();
            }
        }
        return numb;
    }   
}// end class inventory
Это было полезно?

Решение

dvdlist - это ArrayList , которая реализует коллекцию < Интерфейс / a>, а не Массив (кстати, это известно как & программа для интерфейса, а не реализация & принцип; вы должны декальтировать java.util.List как RatedDVD):

private ArrayList<RatedDVD> dvdlist;// declare dvdlist as ArrayList of RatedDVD

Взгляните на методы в интерфейсе Collection, вы найдете все необходимое для добавления и удаления элементов.

Итак, чтобы добавить ArrayList, вам не нужно использовать временный массив add(Object o), который в любом случае не поместится в remove(Object o), как вы делаете здесь:

// add a new dvd to the end, increasing the array size
public void add(RatedDVD p) {
    RatedDVD[] temp = new RatedDVD[dvdlist.size()+1];
    for (int i = 0; i < dvdlist.size(); i++) {
            temp[i] = dvdlist[i];
    }
    temp[temp.length-1] = p; // add it at the end
    dvdlist = temp;
}

Вместо этого просто вызовите метод contains(Object o) для <=>.

Чтобы удалить экземпляр <=>, используйте метод <=> в <=>.

Для метода search () рассмотрите возможность использования <=> в <=>.

Если вам нужно перебрать коллекцию, используйте Итератор :

for (Iterator iter = dvdlist.iterator(); iter.hasNext();) {
   RatedDVD ratedDVD = (RatedDVD) iter.next();
   //rest of the code block removed
}

Или еще быстрее теперь с Java 5+ и Generics:

for (RatedDVD ratedDVD : dvdlist) {
   // rest of the code here
}

Действительно, вам нужно откопать коллекцию Framework .

Другие советы

Ошибки компилятора, по-видимому, достаточно описывают то, что вы делаете неправильно, но я понимаю, почему вы можете быть смущены тем, как это сделать правильно. Вы, кажется, неправильно понимаете, как ArrayList предназначен для использования. Если вы посмотрите на документы вы увидите, что у него есть методы add() и remove(), которые выполняют операции, для которых вы создали методы delete() и <=>. Вы пытаетесь обработать ArrayList, как если бы он был необработанным массивом. Не делай этого; использовать методы, предоставляемые API. Это не только решит ваши ошибки, но и сделает ваш код чище и понятнее будущим программистам.

На самом деле, ошибка компилятора очень ясна:

/tmp/jc_4083/Inventory.java:101: incompatible types
found   : RatedDVD[]
required: java.util.ArrayList
        dvdlist = temp;

Там написано " несовместимые типы " и что он ожидал java.util.ArrayList, но нашел вместо этого RatedDVD[].

Ваша проблема в том, что, в отличие от языков, подобных Python, Java не обрабатывает списки и массивы взаимозаменяемо. Это совершенно разные вещи - массивы - это специальные конструкции на уровне языка, в то время как ArrayList - это класс, как и любой другой.

Таким образом, вы не можете присвоить массив переменному списку типов. Вам либо нужно решить использовать только один из этих двух типов в вашей программе, либо вы должны выполнить преобразование между ними вручную, используя такие методы, как java.util.Arrays.asList() и List.toArray().

Похоже, вы пытаетесь делать слишком сложные вещи слишком быстро - вам, вероятно, стоит взглянуть на Учебники по Java сначала - хотя они достаточно всеобъемлющие и могут также использоваться в качестве справочной информации для поиска сведений о языке. Также есть раздел о преобразовании между коллекциями и массивами .

Я предлагаю вам использовать IDE (например, Eclipse, совершенно бесплатно). Он поможет вам разобраться в синтаксисе API, предлагая подсказки при вводе и отображать ошибки при их вводе, чтобы вы могли точно определить синтаксические ошибки и спросить о них. С точки зрения вопроса, это то, для чего предназначен StackOverflow.

Другие опрашивают меня на ваш конкретный вопрос о синтаксисе, поэтому я просто ограничиваю свой ответ общим вопросом о том, как вы получаете помощь.

Чтобы устранить ошибки компилятора, обычно лучше начать с первой и исправить ее первой. После исправления этого, остальные ошибки компилятора также могут быть решены, или это могут быть ошибки разных типов.

Чтобы понять, что означает какая-то ошибка компилятора, есть статья под названием Compile and Ошибки времени выполнения в Java (PDF), которые проходят через различные виды сообщений об ошибках и приводят примеры того, какой код может их вызывать. А что касается сообщений об ошибках во время выполнения, в Java Glossary есть их довольно большой список . У них также есть список сообщений об ошибках во время компиляции .

Итак, ваша проблема здесь в том, что вы пытаетесь получить доступ к ArrayList как к массиву, что неверно, потому что Java не делает ничего подобного. Вам нужно использовать list.get (i), чтобы получить элемент ih в массиве. Точно так же, когда вы пытались установить переменную ArrayList в массив, компилятор разозлился на вас. Вам нужно создать новый ArrayList с содержимым temp, а затем установить для него dvdlist, например. dvdlist = new ArrayList<RatedDVD>(temp);.

Что касается ваших постоянных проблем: спецификация API для Java, которая в основном говорит вам, как использовать все классы, включенные в API Java. Например, ArrayList является общей коллекцией который имеет определенные методы и конструкторы, которые вам нужно использовать. В Java нет перегрузки операторов, поэтому вы не можете просто получить доступ к элементам списка с использованием синтаксиса массива. Кроме того, массивы имеют свой собственный тип данных, поэтому вы не можете просто рассматривать ArrayList как массив и наоборот.

Похоже, вы не понимаете разницы между массивом и ArrayList. Массив представляет собой статический список элементов и создается с использованием символов []. ArrayList - это объект в системе Collections в Java, который действует как массив с изменяемым размером - то есть он может быть проиндексирован, а также может быть добавлен, вставлен и т. Д. Они не являются взаимозаменяемыми.

Относительно того, где вы можете искать и т. д. Если это ваш первый опыт программирования, вы не одиноки. Многие ошибки компилятора менее чем полезны. Одно предложение, которое я могу вам дать, которое я выучил за многие годы проб и ошибок - начните с малого и развивайтесь. Получить основной метод, который компилируется. Затем добавьте первый маленький кусочек (например, создайте класс). Затем добавьте следующий кусок и так далее. Тестируйте, как вы идете и т. Д. Вы можете погуглить для конкретных ошибок компилятора - я был удивлен, что я нашел. Кроме того, многое из этого является методом проб и ошибок - это то, чему вы учитесь из опыта, и большая скорость & Quot; old hands & Quot; приходит из долгого опыта, чтобы увидеть, что вы можете делать неправильно снова и снова, а не какой-то врожденный интеллект. Я полностью понимаю ваше разочарование - я чувствовал себя так, когда начинал около 15 лет назад (но я был на Borland Pascal - черт).

Одна из самых больших проблем начинающих программистов, по-видимому, заключается в том, что она не может очень хорошо читать и интерпретировать сообщения об ошибках.

Вам было бы полезно внимательно изучить ошибки, которые предоставляет javac (или любой компилятор / интерпретатор). Может быть, даже начните с некоторых ошибок, которые вы понимаете в своем коде (например, присвойте переменной неверное типизированное значение, расширьте цикл за пределами границ) и посмотрите, как ваш компилятор их обрабатывает.

Попробуйте мыслить объектно-ориентированными терминами ...

Мне кажется, что что-то (классная работа, я полагаю) подтолкнуло вас к написанию объектно-ориентированной программы, но возможно, что вы еще не приняли, что вам нужно будет думать в этих терминах.

В Java большинство вещей являются объектами, но Java поддерживает примитивные типы и массивы обоих. Программирование на Java возможно простым, процедурным, изменяемым способом, но также возможно писать объектно-ориентированным функциональным способом. Можно сделать и то и другое и запутаться, вот где вы можете быть прямо сейчас.

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

Так что думайте о структурах данных как о чёрных ящиках с методами, а затем посмотрите, что вы делаете, сами реализуете их.

Вы, вероятно, были здесь, но это вещи, которые вы можете сделать с ArrayList . И у вас есть ArrayList<RatedDVD>, который еще больше ограничивает то, что вы можете с ним делать. Попытайтесь сначала понять это, а затем исправьте программу для работы с доступными операциями над объектом ArrayList.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top