Question

Je demande de l'aide pour l'auto-assistance, qui est une sorte d'oxymoron. Comment est-ce que je blesse moins vos gentils gens en résolvant plus de mes propres problèmes?

Je suis dans ma dernière semaine de programmation Java et je rencontre de gros problèmes en apprenant Java. J'ai lu tous les livres mais je continue à m'attarder sur de minuscules problèmes. C'est comme essayer de construire un château de cartes. Je ne connais que les parties de la syntaxe et les utilisations décrites dans le livre. Lorsque je combine des choses, je rencontre d’horribles obstacles. J'essaie pendant des heures de bricoler pour les comprendre. Les documents Sun ne montrent que les utilisations de base qui ne semblent pas aider

Voici ce que je voudrais:

Lorsque j'essaie quelque chose et que cela ne fonctionne pas comme les manipulations suivantes d'une liste de tableaux, je souhaite trouver un emplacement ou un programme pouvant afficher des exemples de code, comme l'ajout d'une instance de classe supplémentaire à un tableauListe. Où puis-je apprendre de manière concise à ce sujet sans avoir à poser une question ou 2 pour chaque erreur de syntaxe? Où est le Google pour Java? Existe-t-il un programme qui prend en charge vos erreurs et vous montre comment les corriger (ou proposer des suggestions)?

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

Voici mon code pour cette classe si quelqu'un est intéressé à le regarder pour moi:

//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
Était-ce utile?

La solution

Le dvdlist est un ArrayList , qui implémente la Collection interface, pas un tableau (BTW, et cela est connu comme le programme & "; interface; pas une implémentation &"; principe; vous devez décaler java.util.List comme RatedDVD):

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

Consultez les méthodes de l'interface Collection. Vous y trouverez tout ce dont vous avez besoin pour ajouter et supprimer des éléments.

Donc, pour ajouter un ArrayList, vous n'avez pas besoin d'utiliser un tableau temporaire de add(Object o) qui ne s'intégrera pas dans un remove(Object o) comme vous le faites ici:

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

Au lieu de cela, appelez simplement la contains(Object o) méthode sur <=>.

Pour supprimer une instance <=>, utilisez la méthode <=> sur <=>.

Pour la méthode search (), envisagez d’utiliser <=> sur <=>.

Si vous devez parcourir une collection, utilisez un Iterator :

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

Ou encore plus vite maintenant avec Java 5+ et Generics:

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

Vraiment, vous devez creuser la Collection. Cadre .

Autres conseils

Les erreurs du compilateur semblent être assez descriptives de ce que vous faites mal, mais je comprends pourquoi vous pourriez être confus quant à la façon de le faire correctement. Vous semblez avoir mal compris comment utiliser un ArrayList. Si vous consultez le docs , vous verrez qu'il contient des méthodes add() et remove() qui effectuent les opérations pour lesquelles vous avez créé delete() et <=>. Vous essayez de traiter la liste de tableaux comme s'il s'agissait d'un tableau brut. Ne fais pas ça utilisez les méthodes fournies par l'API. Cela résoudra non seulement vos erreurs, mais rendra votre code plus propre et plus clair pour les futurs programmeurs.

En fait, l'erreur du compilateur est très claire:

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

Il est dit & "types incompatibles &"; et qu'il attend un java.util.ArrayList mais trouve à la place un RatedDVD[].

Votre problème est simplement que, contrairement à des langages tels que Python, Java ne traite pas les listes et les tableaux de manière interchangeable. Ce sont des choses complètement différentes: les tableaux sont des constructions spéciales au niveau de la langue, tandis que ArrayList est une classe comme une autre.

Vous ne pouvez donc pas affecter un tableau à une liste de types variable. Vous devez soit choisir d'utiliser un seul de ces deux types dans votre programme, soit convertir manuellement entre eux, à l'aide de méthodes telles que java.util.Arrays.asList() et List.toArray().

Il semble que vous essayez de faire les choses trop avancées trop rapidement - vous devriez probablement regarder le fichier Didacticiels Java - bien qu’ils soient assez complets et puissent également servir de référence pour la recherche de détails linguistiques. Il existe également une section sur la conversion entre des collections et des tableaux .

Je vous suggère d’utiliser un IDE (comme Eclipse, entièrement gratuit). Il vous aidera à comprendre la syntaxe de l'API en faisant des suggestions lors de la frappe et vous montrera les erreurs lors de la frappe afin que vous puissiez identifier les erreurs de syntaxe exactes et poser des questions à leur sujet. En termes de demande, c’est à cela que sert StackOverflow.

D'autres m'ont battu à votre question de syntaxe spécifique, je me limite donc à répondre à la question générale de savoir comment obtenir de l'aide.

Pour résoudre les erreurs du compilateur, il est généralement préférable de commencer par le premier et de le réparer en premier. Après avoir corrigé le problème, les autres erreurs du compilateur peuvent également être résolues ou différemment.

Pour comprendre ce que signifie une erreur du compilateur, un article intitulé Compile et Erreurs d’exécution en Java (PDF) qui traversent différents types de messages d’erreur et donnent des exemples de leur type. Et pour ce qui est des messages d'erreur d'exécution, le glossaire Java contient une une liste assez longue . Ils ont également une liste des messages d'erreur au moment de la compilation .

Votre problème ici est donc que vous essayez d'accéder à ArrayList comme un tableau, ce qui est incorrect car Java ne fait pas ce genre de choses. Vous devez utiliser list.get (i) pour obtenir l’élément ith dans un tableau. De même, lorsque vous avez essayé de définir une variable ArrayList dans un tableau, le compilateur s'est mis en colère contre vous. Vous devez créer une nouvelle ArrayList avec le contenu de temp, puis définir dvdlist à celle-ci, par exemple. dvdlist = new ArrayList<RatedDVD>(temp);

En ce qui concerne vos problèmes persistants: il existe une Spécification d'API pour Java qui vous explique en gros comment utiliser toutes les classes incluses dans l'API Java. Par exemple, ArrayList est une collection générique. qui a certaines méthodes et constructeurs que vous devez utiliser. Java ne surcharge pas les opérateurs, vous ne pouvez donc pas simplement accéder aux éléments d'une liste à l'aide de la syntaxe d'un tableau. De plus, les tableaux sont leur propre type de données, vous ne pouvez donc pas traiter une liste de tableaux comme un tableau et inversement.

Il semble que vous soyez confus quant à la différence entre un tableau et une liste de tableaux. Un tableau est une liste statique d'éléments et est construit à l'aide des symboles []. Une ArrayList est un objet du système Collections en Java qui agit comme un tableau modifiable en taille, c’est-à-dire qu’il peut être indexé, ajouté, inséré, etc. Ils ne sont pas interchangeables.

Quant à savoir où vous pouvez regarder, etc. S'il s'agit de votre première expérience en programmation, vous n'êtes pas seul. De nombreuses erreurs de compilation sont moins qu'utiles. Une suggestion que je peux vous donner que j’ai apprise au cours de nombreuses années d’essais et d’erreur - commencez petit et grandissez. Obtenez une méthode principale qui compile. Ajoutez ensuite le premier petit morceau (créer une classe par exemple). Ajoutez ensuite la pièce suivante, etc. Testez au fur et à mesure, etc. Vous pouvez google pour des erreurs de compilation particulières - j'ai été surpris de ce que j'ai trouvé. Au-delà de cela, il s'agit en grande partie d'essais et d'erreurs - ce sont des choses que vous apprenez de l'expérience et de la vitesse de & "Vieilles mains &"; vient de la longue expérience de voir ce que vous pouvez faire encore et encore, pas une sorte d'intelligence innée. Je comprends tout à fait votre frustration - je le ressentais lorsque je débutais il ya environ 15 ans (mais j’étais sur Borland Pascal - beurk).

L’un des plus gros problèmes que les programmeurs débutants semblent avoir est de ne pas être capable de lire et d’interpréter très bien les messages d’erreur.

Vous seriez bien servi en examinant attentivement les erreurs fournies par javac (ou tout compilateur / interprète). Peut-être même que vous commenciez par faire des erreurs que vous comprenez dans votre code (c'est-à-dire, assigner une valeur typée incorrecte à une variable, étendre une boucle au-delà des limites) et voir comment votre compilateur les gère

Essayez de penser en termes d'objet ...

Il me semble que quelque chose (le travail en classe, je suppose) vous a poussé à écrire un programme orienté objet, mais il est possible que vous n'ayez pas encore accepté le besoin de penser en ce sens.

En Java, la plupart des objets sont des objets, mais Java prend en charge les types primitifs et les tableaux des deux. Il est possible de programmer en Java de manière plate, procédurale et modifiable, mais aussi d'écrire de manière fonctionnelle. Il est possible de faire les deux et de se perdre, ce qui est l'endroit où vous vous trouvez peut-être maintenant.

Vous essayez de mélanger les deux styles. Ce n’est pas toujours une mauvaise chose, mais pour les cours, nous pouvons parier en toute sécurité que votre instructeur voudra voir plus d’objets et moins de tableaux, à moins que ces tableaux ne soient l’implémentation interne privée d’un objet.

Pensez donc aux structures de données comme à des boîtes noires avec des méthodes, puis voyez comment vous en implémentez une.

Vous êtes probablement déjà venu ici, mais il s'agit de les choses que vous pouvez faire avec un ArrayList . Et vous avez un ArrayList<RatedDVD> qui limite encore ce que vous pouvez en faire. Essayez d’abord de comprendre cela, puis corrigez le programme pour qu’il fonctionne avec les opérations disponibles sur un objet ArrayList.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top