Pergunta

Eu estou pedindo ajuda na auto-ajuda, que é uma espécie de paradoxo. Como faço para chateá-lo pessoal agradáveis ??menos, resolvendo mais de meus próprios problemas?

Estou na minha última semana de programação Java e estou tendo um grande obstáculo com a aprendizagem de Java. Eu li todos os livros, mas eu continuo ficando pendurado em pequenas questões pequenas. É como tentar construir um castelo de cartas. Eu só sei sobre as partes da sintaxe e os usos que mostra o livro. Quando estou combinando as coisas, eu me deparo com obstáculos terríveis. Eu tento para horas de ajustes para entendê-los. Os docs sol mostrar apenas os usos básicos que não parecem ajudar

Aqui está o que eu gostaria:

Quando eu estou tentando alguma coisa e ele não funciona como as seguintes manipulações de uma lista de matriz, quero encontrar um lugar ou programa que pode mostrar código de exemplos de coisas como a adição de uma instância da classe adicional para um ArrayList. Onde posso aprender de forma concisa sobre isso sem ter que fazer uma pergunta ou 2 para cada erro de sintaxe? Onde está o Google para Java? Existe um programa que vai levar os seus erros e mostrar-lhe como corrigi-los (ou oferecer sugestões)?

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

Aqui está o meu código para esta classe se alguém está interessado em olhar para mim:

//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
Foi útil?

Solução

O dvdlist é um ArrayList , que implementa o Collection interface, não um array (BTW, e isso é conhecido como o "programa para uma interface, não uma implementação" princípio, você deve decalare dvdlist como um java.util.List):

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

Tenha um olhar para os métodos na interface coleção, você vai encontrar tudo que você precisa para adicionar e remover elementos.

Assim, para adicionar um RatedDVD, você não precisa usar uma matriz temporária de RatedDVD que não vai caber qualquer maneira em um ArrayList como você está fazendo aqui:

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

Em vez disso, basta chamar o método add(Object o) em dvdlist.

Para excluir uma instância RatedDVD, use o método remove(Object o) em dvdlist.

Para o método search (), considere o uso contains(Object o) em dvdlist.

Se você precisar iterar sobre uma coleção, use um Iterator :

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

Ou ainda mais rápido agora com Java 5 + e Genéricos:

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

Realmente, você precisa cavar a Colecção quadro .

Outras dicas

Os erros do compilador parecem ser bastante descritivo do que você está fazendo errado, mas eu posso ver porque você pode estar confuso sobre como fazer isso direito. Você parece estar mal-entendido como um ArrayList é feito para ser usado. Se você olhar para o docs , você vai ver que tem métodos add() e remove() que fazer as operações que você criou métodos add() e delete() para. Você está tentando tratar o ArrayList como se fosse uma matriz cru. Não faça isso; utilizar os métodos fornecidos pela API. Não só isso vai resolver seus erros, mas ele vai fazer seu código mais limpo e mais claro para os programadores futuras.

Na verdade, o erro do compilador é muito clara:

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

Ele diz "tipos incompatíveis" e que esperava uma java.util.ArrayList mas encontrou, em vez de um RatedDVD[].

Seu problema é simplesmente que, ao contrário de linguagens como Python, Java faz listas não tratar e matrizes alternadamente. São coisas completamente diferentes - matrizes são construções especiais em nível de linguagem, enquanto ArrayList é uma classe como qualquer outro

.

Então, você não pode atribuir uma matriz a uma variável do tipo lista. Você tem que decidir sobre o uso apenas um desses dois tipos em todo o seu programa, ou você tem que converter entre eles manualmente, usando métodos como java.util.Arrays.asList() e List.toArray().

Parece que você está tentando fazer as coisas muito avançadas muito rápido - você provavelmente deve olhar de Sun tutoriais Java primeiro - embora eles são bastante abrangente e também pode ser usado como referência para procurar detalhes de linguagem. Há também uma seção sobre conversão entre coleções e arrays .

Eu sugiro que você use um IDE (como o Eclipse, inteiramente livre). Ela irá ajudá-lo através da sintaxe API fazendo sugestões enquanto você digita, e mostrar-lhe os erros quando você digitá-los, de modo que você pode identificar erros de sintaxe exatas e perguntar sobre eles. Em termos de perguntar, isso é o que StackOverflow é para.

Outros bater-me à sua pergunta sintaxe específica, por isso estou apenas limitando minha resposta à questão geral de como você obter ajuda.

Para resolver erros do compilador, geralmente é melhor começar com o primeiro e corrigi-lo primeiro. Depois de corrigir isso, o resto dos erros do compilador pode também ser resolvido, ou eles podem ser diferentes tipos de erros.

Para entender o que alguns meios de erro do compilador, há um artigo chamado Compilar e Erros de tempo de execução em Java (PDF) que passa por diferentes tipos de mensagens de erro e dá exemplos de que tipo de código pode causar-lhes. E quanto a mensagens de erro de tempo de execução, Java Glossary tem bastante uma grande lista deles . Eles também têm uma lista de tempo de compilação mensagens de erro .

Então, o problema aqui é que você está tentando acessar um ArrayList como um array, que é incorreta porque Java não faz coisas assim. Você precisa usar list.get (i) para obter o elemento om em uma matriz. Da mesma forma, quando você tentou definir uma variável de ArrayList para uma matriz, o compilador ficou com raiva de você. Você precisa criar um novo ArrayList com o conteúdo de temperatura e, em seguida, definir dvdlist para que, por exemplo. dvdlist = new ArrayList<RatedDVD>(temp);.

Como para os seus problemas continuaram: Há um API Specification para Java que lhe diz basicamente como usar todas as classes que estão incluídos na API Java. Por exemplo, ArrayList é uma coleção genérica que tem certos métodos e construtores que você precisa usar. Java não tem sobrecarga de operadores, para que você não pode apenas elementos de acesso em uma lista usando a sintaxe de array. Além disso, as matrizes são o seu próprio tipo de dados para que você não pode apenas tratar um ArrayList como uma matriz e vice-versa.

Parece que você está confuso sobre a diferença entre uma matriz e um ArrayList. Uma matriz é uma lista de elementos estática, e é construída usando os símbolos []. Um matrizes é um objecto no sistema Colecções em Java que actua como uma matriz de tamanho modificável -. Isto é, pode ser indexado em, e pode ser adicionado para, inserida no, etc Eles não são intermutáveis ??

Como para onde você pode olhar, etc. Se esta é sua primeira experiência em programação, você não está sozinho. Muitos erros do compilador são menos do que útil. Uma sugestão que pode dar-lhe que eu aprendi através de muitos anos de tentativa e erro - começar pequeno e construir. Obter um método main que compila. Em seguida, adicione a primeira peça pouco (criação de uma classe, por exemplo). Em seguida, adicione a próxima peça, e assim por diante. Teste como você vai, etc. Você pode google para determinados erros do compilador - I foram surpreso com o que eu encontrei. Além disso, um lote de que é tentativa e erro - estas são coisas que você aprende com a experiência, e um monte da velocidade de "velhos mãos" vem da longa experiência de ver o que você pode fazer sobre o errado e outra vez, e não qualquer tipo de inteligência inata. Eu entendo totalmente sua frustração - eu me senti assim quando eu estava começando para fora cerca de 15 anos agora (mas eu estava em Borland Pascal - eca).

Um dos maiores problemas que começam programadores parecem ter não é ser capaz de ler e interpretar mensagens de erro muito bem.

Você estaria bem servido por examinar com cuidado os erros que javac (ou qualquer compilador / intérprete) fornece. Talvez até mesmo começar por fazer alguns erros que você entenda em seu código (ou seja, atribuir um valor digitado incorreto a uma variável, estender um laço além dos limites) e ver como seus punhos do compilador estes.

Tente pensar em orientadosa termos ...

Parece-me que algo (classwork, eu acho) levou você a escrever um programa orientado a objeto, mas é possível que você ainda não aceitaram que você terá que pensar nesses termos.

Em Java maioria das coisas são objetos, mas Java suporta tipos primitivos, e matrizes de ambos. É possível programar em Java em um apartamento, maneira processual, mutável, mas também possível escrever de uma forma funcional orientada a objetos. É possível fazer as duas coisas e ficar confuso, que é onde você pode ser agora.

Você está tentando misturar os dois estilos. Isso nem sempre é uma coisa ruim, mas para cursos podemos seguramente apostar a fazenda que seu instrutor vai querer ver mais objetos e menos matrizes, a menos que essas matrizes são a implementação interna privada de um objeto.

Então, pense das estruturas de dados como caixas pretas com métodos e, em seguida, ver como o que você está fazendo está implementando um você mesmo.

Você provavelmente tem sido aqui, mas estes são as coisas que você pode fazer com um ArrayList. E você tem uma ArrayList<RatedDVD> que mais restringe o que você pode fazer com ele. Tente entender isso primeiro, e depois corrigir o programa para trabalhar com as operações disponíveis em um objeto ArrayList.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top