Учебники для ошибок и синтаксиса Java - PullRequest
1 голос
/ 10 сентября 2009

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

Я на последней неделе программирования на 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

Ответы [ 9 ]

5 голосов
/ 10 сентября 2009

dvdlist - это ArrayList , который реализует интерфейс Collection , а не массив (кстати, это называется программой для интерфейса, а не реализацией). В принципе, вы должны декальезировать dvdlist как java.util.List):

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

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

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

// 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;
}

Вместо этого просто вызовите метод add(Object o) для dvdlist.

Чтобы удалить экземпляр RatedDVD, используйте метод remove(Object o) для dvdlist.

Для метода search () рассмотрите возможность использования contains(Object o) для dvdlist.

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

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
}

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

3 голосов
/ 10 сентября 2009

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

2 голосов
/ 10 сентября 2009

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

/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 от Sun - хотя они довольно всеобъемлющие и могут также использоваться в качестве справочного материала для поиска языковые детали. Также есть раздел о преобразовании между коллекциями и массивами .

1 голос
/ 10 сентября 2009

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

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

1 голос
/ 10 сентября 2009

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

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

0 голосов
/ 10 сентября 2009

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

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

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

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

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

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

0 голосов
/ 10 сентября 2009

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

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

0 голосов
/ 10 сентября 2009

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

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

0 голосов
/ 10 сентября 2009

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

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

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