1

我正在寻求自助方面的帮助,这有点矛盾。我如何通过解决更多我自己的问题来少打扰你们这些好人?

我在 Java 编程的最后一周,我在学习 Java 方面遇到了巨大的障碍。我已经阅读了所有的书,但我一直被一些小问题挂断。这就像试图建立一个纸牌屋。我只知道本书展示的部分语法和用途。当我组合事物时,我遇到了可怕的障碍。我尝试了几个小时的修补来弄清楚它们。sun 文档仅显示似乎无济于事的基本用途

这是我想要的:

当我尝试某些事情并且它不像数组列表的以下操作那样工作时,我想找到一个可以显示示例代码的地方或程序,例如向arrayList 添加一个额外的类实例。我在哪里可以简洁地了解这一点,而不必为每个语法错误问一个或 2 个问题?Google for 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
4

9 回答 9

5

dvdlist是一个ArrayList,它实现了Collection接口,而不是一个 Array (顺便说一句,这被称为“程序到接口,而不是实现”原则,你应该声明dvdlist为 a java.util.List):

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

看看 Collection 接口上的方法,你会发现添加和删除元素所需的一切。

因此,要添加 a 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)on 上的方法dvdlist

要删除RatedDVD实例,请使用remove(Object o)on 方法dvdlist

对于 search() 方法,请考虑使用contains(Object o)on dvdlist

如果您需要遍历集合,请使用Iterator

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

或者现在使用 Java 5+ 和泛型甚至更快:

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

真的,您需要挖掘Collection Framework

于 2009-09-09T22:56:26.083 回答
3

编译器错误似乎可以很好地描述您做错了什么,但是我可以理解为什么您可能会对如何正确做感到困惑。您似乎误解了 ArrayList 的使用方式。如果您查看文档,您会看到它具有方法add(),并且remove()可以执行您创建的操作add()delete()方法。您试图将 ArrayList 视为原始数组。不要那样做;使用 API 提供的方法。这不仅可以解决您的错误,而且可以让您的代码对未来的程序员更清晰、更清晰。

于 2009-09-09T22:34:02.600 回答
2

实际上,编译器错误很明显:

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

它说“不兼容的类型”并且它期望 ajava.util.ArrayList但发现而不是 a RatedDVD[]

您的问题很简单,与 Python 等语言不同,Java 不会互换处理列表和数组。它们是完全不同的东西——数组是特殊的语言级结构,而ArrayList与其他类一样。

因此,您不能将数组分配给列表类型的变量。您要么必须决定在整个程序中仅使用这两种类型中的一种,要么必须使用 和 等方法手动在它们之间进行java.util.Arrays.asList()转换List.toArray()

似乎您试图太快地做太高级的事情——您可能应该先看看 Sun 的Java 教程——尽管它们非常全面,也可以用作查找语言细节的参考。还有一节是关于集合和数组之间的转换

于 2009-09-09T22:34:15.947 回答
1

我建议您使用 IDE(如 Eclipse,完全免费)。它将通过在您键入时提出建议来帮助您了解 API 语法,并在您键入错误时向您显示错误,以便您可以查明准确的语法错误并询问它们。就询问而言,这就是 StackOverflow 的用途。

其他人在您的特定语法问题上击败了我,所以我只是将我的答案限制在您如何获得帮助的一般问题上。

于 2009-09-09T22:38:44.950 回答
1

要解决编译器错误,通常最好从第一个开始,然后先修复它。修复它之后,其余的编译器错误也可能得到解决,或者它们可能是不同类型的错误。

要了解某些编译器错误的含义,有一篇名为Java 中的编译和运行时错误(PDF) 的文章,其中介绍了不同类型的错误消息,并给出了可能导致错误消息的代码示例。至于运行时错误消息,Java Glossary 有相当多的列表。他们还有一个编译时错误信息列表

于 2009-09-09T22:51:26.053 回答
0

所以,你的问题是你试图访问一个像数组一样的 ArrayList,这是不正确的,因为 Java 不做这样的事情。您需要使用 list.get(i) 来获取数组中的第 i 个元素。同样,当您尝试将 ArrayList 变量设置为数组时,编译器会生您的气。您需要使用 temp 的内容创建一个新的 ArrayList,然后将 dvdlist 设置为该内容,例如。dvdlist = new ArrayList<RatedDVD>(temp);.

至于您继续遇到的问题: Java API 规范基本上告诉您如何使用 Java API 中包含的所有类。例如,ArrayList是一个泛型集合,它具有您需要使用的某些方法和构造函数。Java 没有运算符重载,因此您不能只使用数组语法访问 List 中的元素。此外,数组是它们自己的数据类型,因此您不能只将 ArrayList 视为数组,反之亦然。

于 2009-09-09T22:35:51.850 回答
0

看起来您对数组和 ArrayList 之间的区别感到困惑。数组是元素的静态列表,使用 [] 符号构造。ArrayList 是 Java 中 Collections 系统中的一个对象,它的作用类似于大小可修改的数组 - 即它可以被索引到,并且可以添加到、插入等等。它们是不可互换的。

至于你可以在哪里看等等。如果这是你的第一次编程体验,你并不孤单。许多编译器错误无济于事。我可以给你的一个建议是我通过多年的反复试验学到的——从小处着手,逐步建立。获取编译的主要方法。然后添加第一个小块(例如创建一个类)。然后添加下一块,依此类推。随时进行测试等。您可以搜索特定的编译器错误 - 我对我的发现感到惊讶。除此之外,很多都是反复试验——这些都是你从经验中学到的东西,“老手”的很多速度来自于一次又一次地看到你可以做错什么的长期经验,而不是任何某种与生俱来的智慧。

于 2009-09-09T22:36:23.273 回答
0

初学者似乎遇到的最大问题之一是无法很好地阅读和解释错误消息。

通过仔细检查javac(或任何编译器/解释器)提供的错误,您会得到很好的服务。甚至可能从在代码中犯一些您理解的错误开始(即,为变量分配不正确的类型值,将循环扩展到边界之外),然后看看您的编译器如何处理这些错误。

于 2009-09-09T22:42:23.870 回答
0

尝试用面向对象的术语来思考......

在我看来,某些东西(我猜是课业)促使您编写面向对象的程序,但您可能还没有接受您需要以这些术语进行思考。

在 Java 中,大多数东西都是对象,但 Java 支持原始类型和两者的数组。可以以扁平化、过程化、可变的方式用 Java 编程,也可以用面向对象的函数式方式编写。两者都有可能会感到困惑,这就是您现在可能所处的位置。

您正在尝试混合两种样式。这并不总是一件坏事,但对于课程作业,我们可以放心地向农场打赌,您的教师将希望看到更多的对象和更少的数组,除非这些数组是对象的私有内部实现。

所以把数据结构想象成带有方法的黑盒子,然后看看你在做什么是如何自己实现的。

你可能来过这里,但这些是你可以用 ArrayList 做的事情。你有一个ArrayList<RatedDVD>进一步限制你可以用它做什么。首先尝试理解这一点,然后修复程序以使用 ArrayList 对象上的可用操作。

于 2009-09-09T22:53:06.400 回答