Frage

Ich bitte um Hilfe zu Selbsthilfe, die Art eines Oxymoron ist. Wie kann ich Fehler, den Sie nette Leute weniger von mehr meiner eigenen Probleme zu lösen?

Ich bin in meiner letzten Woche der Java-Programmierung und ich bin eine große Hürde mit dem Lernen Java habe. Ich habe alle Bücher gelesen, aber ich werde immer hing an winzig kleinen Probleme auf. Es ist wie der Versuch, ein Kartenhaus zu bauen. Ich weiß nur, über die Teile der Syntax und die Verwendungen, die das Buch zeigt. Wenn ich die Dinge bin Kombination, ich laufe in schreckliche Hürden. Ich versuche, für Stunden Bastelei sie herauszufinden. Die Sonne docs zeigen nur die grundlegenden Anwendungen, die nicht zu helfen scheinen

Hier ist, was ich möchte:

Wenn ich etwas versuchen, und es funktioniert nicht wie die folgenden Manipulationen einer Array-Liste, ich möchte einen Ort oder ein Programm zu finden, Beispiele Code Dinge wie das Hinzufügen einer zusätzlichen Klasseninstanz zu einer Arraylist zeigen. Wo kann ich kurz darüber lernen, ohne eine Frage oder 2 für jeden Syntaxfehler fragen? Wo ist die Google für Java? Gibt es ein Programm, das Ihre Fehler nehmen und Ihnen zeigen, wie sie zu beheben (oder bieten Anregungen)?

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

Hier ist mein Code für diese Klasse, wenn jemand im Blick auf das für mich interessiert ist:

//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
War es hilfreich?

Lösung

Die dvdlist ist ein Arraylist , die implementiert die Collection Schnittstelle, kein Array (BTW, und dies wird als „Programm mit einer Schnittstelle, nicht eine Implementierung“ -Prinzip bekannt ist, sollten Sie dvdlist als java.util.List decalare):

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

Haben Sie einen Blick auf die Methoden auf der Collection-Schnittstelle, werden Sie alles, was Sie für das Hinzufügen und Entfernen von Elementen benötigen.

Also, einen RatedDVD hinzufügen möchte, brauchen Sie nicht ein temporäres Array von RatedDVD zu verwenden, die ohnehin nicht in eine ArrayList passen, wie Sie hier tun:

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

Rufen Sie stattdessen nur die add(Object o) Methode auf dvdlist.

eine RatedDVD Instanz zu löschen, verwenden Sie die remove(Object o) Methode auf dvdlist.

Für die Suche () -Methode prüfen, mit contains(Object o) auf dvdlist.

Wenn Sie eine Sammlung iterieren müssen, verwenden Sie eine Iterator :

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

oder sogar schneller jetzt mit Java 5+ und Generics:

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

Wirklich, müssen Sie die Sammlung graben Rahmen .

Andere Tipps

Die Compiler-Fehler scheinen ziemlich beschreibend zu sein, was Sie falsch machen, aber ich kann sehen, warum Sie verwirrt über sein könnte, wie es richtig zu machen. Sie scheinen Missverständnis zu sein, wie ein Arraylist verwendet werden soll. Wenn man sich die docs , Sie hat es Methoden add() und remove() sehen, die die Operationen tun Sie add() und delete() Methoden erstellt haben. Sie versuchen, die Arraylist zu behandeln, als ob es sich um ein rohes Array ist. Tun Sie das nicht; verwenden, um die Methoden, die von der API zur Verfügung gestellt. Dies wird nicht nur Ihre Fehler lösen, aber es wird Ihren Code sauberen und klare Zukunft Programmierer machen.

Eigentlich ist der Compiler-Fehler ist sehr klar:

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

Er sagt: „inkompatible Typen“, und dass es eine java.util.ArrayList erwartet fand aber stattdessen eine RatedDVD[].

Ihr Problem ist einfach, dass, anders als in Sprachen wie Python, Java nicht behandeln Listen und Arrays austauschbar. Sie sind völlig verschiedene Dinge -. Arrays spezielle Sprach-Level-Konstrukte sind, während ArrayList eine Klasse wie jede andere ist

So können Sie nicht ein Array zu einem variabel vom Typ Liste zuweisen. Sie entweder über die Verwendung nur einer dieser beiden Arten in Ihrem Programm zu entscheiden haben, oder Sie müssen manuell zwischen ihnen konvertieren, Methoden wie java.util.Arrays.asList() und List.toArray().

Es scheint, dass Sie versuchen, schnell zu zu weit fortgeschritten, Dinge zu tun - Sie wahrscheinlich von Sun Java-Tutorials zuerst - obwohl sie recht umfangreich sind und kann auch als zum Nachschlagen Sprache Details Referenz verwendet werden. Es gibt auch einen Abschnitt über Konvertierung zwischen Sammlungen und Arrays .

Ich schlage vor, Sie verwenden, um eine IDE (wie Eclipse, völlig frei). Es wird Sie über die API-Syntax helfen, indem sie Vorschläge machen, wie Sie schreiben, und zeigen Sie Fehler, wenn Sie sie eingeben, so dass Sie genaue Syntaxfehler lokalisieren können und fragen Sie sie. In Bezug auf die Fragen, ist das, was für Stackoverflow ist.

Andere schlugen mich auf Ihre spezifischen Syntax Frage, also bin ich Begrenzung nur meine Antwort auf die allgemeine Frage, wie Sie Hilfe erhalten.

Um Compiler-Fehler zu beheben, in der Regel ist es am besten mit dem ersten beginnen und es zuerst zu beheben. Danach Festsetzung könnte der Rest der Compiler-Fehler auch gelöst, oder sie könnten verschiedene Arten von Fehlern sein.

Um zu verstehen, was einige Compiler-Fehler bedeutet, es ist ein Artikel genannt Compile und Laufzeitfehler in Java (PDF), die durch verschiedene Arten von Fehlermeldungen geht und gibt Beispiele für welche Art von Code können sie verursachen. Und wie für die Laufzeitfehlermeldungen, hat Java Glossar eine recht große Liste von ihnen . Sie haben auch eine Liste der Kompilierung-Fehlermeldungen .

Also, Ihr Problem hier ist, dass Sie eine Arraylist wie ein Array zugreifen möchten, was falsch ist, weil Java Sachen tun nicht so. Sie müssen verwenden list.get (i) das i-te Element in einem Array zu erhalten. Ebenso, wenn Sie einen Arraylist-Variable auf ein Array zu setzen versuchten, bekam der Compiler wütend auf dich. Sie müssen eine neue Arraylist mit dem Inhalt der Temp erstellen und dann setzen dvdlist zu, dass zB. dvdlist = new ArrayList<RatedDVD>(temp);.

Wie für Ihre weiteren Probleme: Es gibt eine API-Spezifikation Java, die Sie im Grunde sagt, wie alle Klassen zu verwenden, die in der Java-API enthalten sind. Zum Beispiel Arraylist ist eine generische Sammlung die hat bestimmte Methoden und Konstrukteuren, die Sie verwenden müssen. Java nicht Überladen von Operatoren, so dass Sie in einer Liste nicht nur Elemente zugreifen können Array-Syntax. Auch Arrays sind, ihr eigener Datentyp, so dass Sie nicht nur eine Arraylist als Array und umgekehrt behandeln.

Es sieht aus wie Sie über den Unterschied zwischen einem Array und einem Arraylist verwirrt sind. Ein Array ist eine statische Liste von Elementen, und ist die [] Symbole konstruiert werden. Eine Arraylist ist ein Objekt in dem System Collections in Java, die wie eine Größe veränderbare Array wirkt - d. H kann es in indexiert werden, und kann auf, in den einge hinzugefügt werden, etc. Sie sind nicht austauschbar

Wie, wo Sie suchen können, usw. Wenn dies Ihre erste Programmiererfahrung ist, sind Sie nicht allein. Viele Compiler-Fehler sind weniger als hilfreich. Ein Vorschlag, den ich Ihnen geben kann, dass ich durch viele Jahre von Versuch und Irrtum gelernt - klein anfangen und aufbauen. Holen Sie sich ein Hauptverfahren, das kompiliert wird. Dann fügen Sie das erste kleine Stück (eine Klasse zum Beispiel erstellen). Dann fügen Sie das nächste Stück, und so weiter. Test, wie Sie gehen, etc. Sie für bestimmte Compiler-Fehler google kann - ich habe überrascht, was ich gefunden habe. Darüber hinaus ist eine Menge davon Versuch und Irrtum - das sind Dinge, die man aus der Erfahrung lernen, und eine Menge von der Geschwindigkeit der „alter Hasen“ stammt aus der langjährigen Erfahrung des Sehens, was Sie falsch über tun können und immer wieder, nicht Art der angeborenen Intelligenz. Ich verstehe Ihre Frustration total - ich so gefühlt, als ich vor nunmehr 15 Jahren anfangen (aber ich war auf Borland Pascal - igitt)

.

Eines der größten Probleme beginnen Programmierer zu haben scheinen ist Fehlermeldungen nicht in der Lage zu lesen und interpretieren sehr gut.

Sie würde gut gedient, indem sorgfältig die Fehler untersuchen, dass javac (oder ein Compiler / Interpreter) zur Verfügung stellt. Vielleicht sogar, indem sie einige Fehler beginnen, die Sie in Ihrem Code zu verstehen (dh, weist einen falschen typisierten Wert auf eine Variable, eine Schleife über die Grenzen erweitern) und sieht, wie der Compiler diese behandelt.

Versuchen in objektorientierten Begriffen zu denken ...

Es scheint mir, dass etwas (Klassenarbeit, ich denke), die Sie in das Schreiben ein objektorientiertes Programm geschoben hat, aber es ist möglich, dass Sie noch nicht angenommen haben, dass Sie in diesen Kategorien denken müssen.

In Java die meisten Dinge sind Objekte, aber Java unterstützt primitive Typen und Anordnungen von beiden. Es ist möglich, in Java in einer flachen, prozedurale, wandelbar Weise zu programmieren, sondern auch in einem objektorientierten funktional zu schreiben. Es ist möglich, beides zu tun und verwirren lassen, das ist, wo Sie gerade sein können.

Sie versuchen, die beiden Stile zu mischen. Dies ist nicht immer eine schlechte Sache, aber für die Kursarbeit können wir sicher die Farm wetten, dass Ihr Lehrer mehr Objekte und weniger Arrays sehen wollen, es sei denn, diese Anordnungen die private interne Implementierung eines Objekts sind.

So denken Sie an den Datenstrukturen als schwarze Kästchen mit Methoden, und dann sehen, wie das, was man tut man sich setzt.

Sie haben wahrscheinlich hier, aber diese sind die Dinge, die Sie mit einem Arraylist tun können. Und Sie haben eine ArrayList<RatedDVD> die weiter einschränkt, was man damit machen kann. Versuchen Sie verstehen dieses zuerst, und dann zu beheben, um das Programm für die Arbeit mit den zur Verfügung stehenden Operationen an einem Arraylist-Objekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top