Domanda

Chiedo aiuto per l'auto-aiuto, che è una specie di ossimoro. Come posso infastidire di meno i miei cari risolvendo di più i miei problemi?

Sono nella mia ultima settimana di programmazione Java e sto affrontando un grande ostacolo con l'apprendimento di Java. Ho letto tutti i libri ma continuo a rimanere impiccato per piccoli problemi. È come provare a costruire un castello di carte. Conosco solo le parti della sintassi e gli usi che il libro mostra. Quando combino le cose, incontro ostacoli orribili. Cerco per ore di armeggiare per capirli. I documenti del sole mostrano solo gli usi di base che non sembrano aiutare

Ecco cosa vorrei:

Quando sto provando qualcosa e non funziona come le seguenti manipolazioni di un elenco di array, voglio trovare un luogo o un programma in grado di mostrare esempi di codice di cose come l'aggiunta di un'istanza di classe aggiuntiva a un arrayList. Dove posso imparare in modo conciso su questo senza dover porre una domanda o 2 per ogni errore di sintassi? Dov'è Google per Java? Esiste un programma che prenderà i tuoi errori e ti mostrerà come risolverli (o offrire suggerimenti)?

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

Ecco il mio codice per questa classe se qualcuno è interessato a guardarlo per me:

//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
È stato utile?

Soluzione

dvdlist è una ArrayList , che implementa la Collection interfaccia, non un array (BTW, e questo è noto come " programma per un'interfaccia, non un implementazione " principio, dovresti decalare java.util.List come RatedDVD):

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

Dai un'occhiata ai metodi sull'interfaccia Collection, troverai tutto il necessario per aggiungere e rimuovere elementi.

Quindi, per aggiungere un ArrayList, non è necessario utilizzare un array temporaneo di add(Object o) che non si adatta comunque in un remove(Object o) come stai facendo qui:

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

Invece, basta chiamare il metodo contains(Object o) su <=>.

Per eliminare un'istanza <=>, utilizzare il metodo <=> su <=>.

Per il metodo search (), considera l'utilizzo di <=> su <=>.

Se è necessario scorrere su una raccolta, utilizzare un Iterator :

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

O ancora più veloce ora con Java 5+ e Generics:

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

Davvero, devi scavare la Collection quadro.

Altri suggerimenti

Gli errori del compilatore sembrano essere abbastanza descrittivi di ciò che stai facendo di sbagliato, ma posso capire perché potresti essere confuso su come farlo nel modo giusto. Sembra che tu abbia frainteso il modo in cui una ArrayList dovrebbe essere utilizzata. Se guardi i docs , vedrai che ha i metodi add() e remove() che eseguono le operazioni per cui hai creato i metodi delete() e <=>. Stai tentando di trattare ArrayList come se fosse un array non elaborato. Non farlo; utilizzare i metodi forniti dall'API. Questo non solo risolverà i tuoi errori, ma renderà il tuo codice più pulito e chiaro per i futuri programmatori.

In realtà, l'errore del compilatore è molto chiaro:

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

Dice " tipi incompatibili " e che si aspettava un java.util.ArrayList ma ha trovato invece un RatedDVD[].

Il tuo problema è semplicemente che, a differenza di linguaggi come Python, Java non tratta in modo intercambiabile elenchi e matrici. Sono cose completamente diverse: le matrici sono costrutti speciali a livello di linguaggio, mentre ArrayList è una classe come qualsiasi altra.

Quindi non è possibile assegnare un array a una lista di tipi variabile. O devi decidere di utilizzare solo uno di questi due tipi durante il tuo programma, oppure devi convertirli manualmente, usando metodi come java.util.Arrays.asList() e List.toArray().

Sembra che tu stia provando a fare cose troppo avanzate troppo in fretta - probabilmente dovresti guardare le tutorial Java prima, anche se sono abbastanza completi e possono anche essere usati come riferimento per cercare i dettagli del linguaggio. C'è anche una sezione sulla conversione tra raccolte e matrici .

Ti suggerisco di utilizzare un IDE (come Eclipse, completamente gratuito). Ti aiuterà attraverso la sintassi API fornendo suggerimenti durante la digitazione e mostrandoti errori durante la digitazione, in modo da poter individuare errori esatti di sintassi e chiederli. In termini di domande, questo è lo scopo di StackOverflow.

Altri mi hanno battuto alla tua specifica domanda di sintassi, quindi sto solo limitando la mia risposta alla domanda generale su come ottenere aiuto.

Per risolvere gli errori del compilatore, di solito è meglio iniziare con il primo e risolverlo per primo. Dopo aver risolto ciò, il resto degli errori del compilatore potrebbe anche essere risolto o potrebbero essere diversi tipi di errori.

Per capire cosa significa un errore del compilatore, esiste un articolo chiamato Compila e Errori di runtime in Java (PDF) che attraversa diversi tipi di messaggi di errore e fornisce esempi del tipo di codice che può causarli. E per quanto riguarda i messaggi di errore di runtime, il Glossario Java ha un elenco piuttosto grande di essi . Hanno anche un elenco di messaggi di errore in fase di compilazione .

Quindi, il tuo problema qui è che stai provando ad accedere a una ArrayList come una matrice, il che non è corretto perché Java non fa cose del genere. È necessario utilizzare list.get (i) per ottenere l'elemento ith in un array. Allo stesso modo, quando hai provato a impostare una variabile ArrayList su un array, il compilatore si è arrabbiato con te. È necessario creare una nuova ArrayList con i contenuti di temp e quindi impostare dvdlist su quello, ad es. dvdlist = new ArrayList<RatedDVD>(temp);.

Per quanto riguarda i tuoi problemi continui: esiste una Specifiche API per Java che ti dice sostanzialmente come usare tutte le classi incluse nell'API Java. Ad esempio, ArrayList è una raccolta generica che ha alcuni metodi e costruttori che è necessario utilizzare. Java non ha un sovraccarico dell'operatore, quindi non puoi semplicemente accedere agli elementi in un elenco usando la sintassi dell'array. Inoltre, gli array sono il loro tipo di dati, quindi non puoi semplicemente trattare un ArrayList come un array e viceversa.

Sembra che tu sia confuso sulla differenza tra un array e un ArrayList. Un array è un elenco statico di elementi ed è costruito usando i simboli []. Un ArrayList è un oggetto nel sistema Collections di Java che agisce come un array modificabile in base alla dimensione, ovvero può essere indicizzato e può essere aggiunto, inserito in, ecc. Non sono intercambiabili.

Da dove puoi guardare, ecc. Se questa è la tua prima esperienza di programmazione, non sei solo. Molti errori del compilatore sono poco utili. Un suggerimento che posso darti che ho appreso attraverso molti anni di tentativi ed errori: iniziare in piccolo e costruire. Ottieni un metodo principale che viene compilato. Quindi aggiungi il primo piccolo pezzo (creando una classe per esempio). Quindi aggiungi il prossimo pezzo e così via. Prova mentre procedi, ecc. Puoi cercare su Google errori di compilatore particolari: sono rimasto sorpreso da ciò che ho trovato. Oltre a ciò, gran parte è prova ed errore - queste sono cose che impari dall'esperienza e molta della velocità di & Quot; mani vecchie & Quot; proviene dalla lunga esperienza di vedere ciò che si può fare di continuo, non una sorta di intelligenza innata. Capisco perfettamente la tua frustrazione - mi sono sentito così quando stavo iniziando circa 15 anni fa (ma ero su Borland Pascal - schifo).

Uno dei maggiori problemi che sembrano avere i programmatori non è in grado di leggere e interpretare molto bene i messaggi di errore.

Saresti ben servito esaminando attentamente gli errori che javac (o qualsiasi compilatore / interprete) fornisce. Forse anche iniziare facendo degli errori che capisci nel tuo codice (ad esempio, assegna un valore digitato errato a una variabile, estendi un ciclo oltre i limiti) e vedi come il compilatore li gestisce.

Prova a pensare in termini orientati agli oggetti ...

Mi sembra che qualcosa (lavoro di classe, immagino) ti abbia spinto a scrivere un programma orientato agli oggetti, ma è possibile che tu non abbia ancora accettato che dovrai pensare in questi termini.

In Java la maggior parte delle cose sono oggetti, ma Java supporta tipi primitivi e matrici di entrambi. È possibile programmare in Java in modo piatto, procedurale, mutabile, ma anche scrivere in modo funzionale orientato agli oggetti. È possibile fare entrambe le cose e confondersi, ed è qui che potresti essere adesso.

Stai provando a mescolare i due stili. Questa non è sempre una cosa negativa, ma per i corsi possiamo tranquillamente scommettere sulla fattoria che il tuo istruttore vorrà vedere più oggetti e meno array, a meno che tali array non siano l'implementazione interna privata di un oggetto.

Pensa quindi alle strutture di dati come scatole nere con metodi, e poi vedi come quello che stai facendo è implementarlo tu stesso.

Probabilmente sei stato qui, ma questi sono le cose che puoi fare con una ArrayList . E hai un ArrayList<RatedDVD> che limita ulteriormente cosa puoi farci. Prova prima a capirlo, quindi correggi il programma affinché funzioni con le operazioni disponibili su un oggetto ArrayList.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top