Учебники для ошибок и синтаксиса Java
-
05-07-2019 - |
Вопрос
Я прошу помощи по самопомощи, которая является своего рода оксюмороном. Как мне меньше мешать вам, приятные люди, решая больше моих собственных проблем?
Я на последней неделе программирования на Java, и у меня огромные трудности с изучением Java. Я прочитал все книги, но продолжаю зацикливаться на крошечных проблемках. Это все равно что пытаться построить карточный домик. Я знаю только о частях синтаксиса и об использовании, которое показывает книга. Когда я комбинирую вещи, я сталкиваюсь с ужасными препятствиями. Я часами пытаюсь разобраться с ними. Солнечные документы показывают только основные виды использования, которые, кажется, не помогают
Вот что я хотел бы:
Когда я что-то пробую, и это не работает, как следующие манипуляции со списком массивов, я хочу найти место или программу, которые могут показать примеры кода, например, добавление дополнительного экземпляра класса в arrayList. Где я могу кратко узнать об этом, не задавая ни одного вопроса или 2 за каждую синтаксическую ошибку? Где находится Google для 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
Решение
Взгляните на методы в интерфейсе Collection, вы найдете все необходимое для добавления и удаления элементов. Итак, чтобы добавить Вместо этого просто вызовите метод Чтобы удалить экземпляр <=>, используйте метод <=> в <=>. Р>
Для метода search () рассмотрите возможность использования <=> в <=>. Если вам нужно перебрать коллекцию, используйте Итератор : Или еще быстрее теперь с Java 5+ и Generics: Действительно, вам нужно откопать коллекцию Framework . dvdlist
- это ArrayList , которая реализует коллекцию < Интерфейс / a>, а не Массив (кстати, это известно как & программа для интерфейса, а не реализация & принцип; вы должны декальтировать java.util.List
как RatedDVD
): р>
private ArrayList<RatedDVD> dvdlist;// declare dvdlist as ArrayList of RatedDVD
ArrayList
, вам не нужно использовать временный массив add(Object o)
, который в любом случае не поместится в remove(Object o)
, как вы делаете здесь: // 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;
}
contains(Object o)
для <=>. for (Iterator iter = dvdlist.iterator(); iter.hasNext();) {
RatedDVD ratedDVD = (RatedDVD) iter.next();
//rest of the code block removed
}
for (RatedDVD ratedDVD : dvdlist) {
// rest of the code here
}
Другие советы
Ошибки компилятора, по-видимому, достаточно описывают то, что вы делаете неправильно, но я понимаю, почему вы можете быть смущены тем, как это сделать правильно. Вы, кажется, неправильно понимаете, как ArrayList предназначен для использования. Если вы посмотрите на документы вы увидите, что у него есть методы add()
и remove()
, которые выполняют операции, для которых вы создали методы delete()
и <=>. Вы пытаетесь обработать ArrayList, как если бы он был необработанным массивом. Не делай этого; использовать методы, предоставляемые API. Это не только решит ваши ошибки, но и сделает ваш код чище и понятнее будущим программистам.
На самом деле, ошибка компилятора очень ясна:
/tmp/jc_4083/Inventory.java:101: incompatible types
found : RatedDVD[]
required: java.util.ArrayList
dvdlist = temp;
Там написано " несовместимые типы " и что он ожидал java.util.ArrayList
, но нашел вместо этого RatedDVD[]
.
Ваша проблема в том, что, в отличие от языков, подобных Python, Java не обрабатывает списки и массивы взаимозаменяемо. Это совершенно разные вещи - массивы - это специальные конструкции на уровне языка, в то время как ArrayList
- это класс, как и любой другой.
Таким образом, вы не можете присвоить массив переменному списку типов. Вам либо нужно решить использовать только один из этих двух типов в вашей программе, либо вы должны выполнить преобразование между ними вручную, используя такие методы, как java.util.Arrays.asList()
и List.toArray()
.
Похоже, вы пытаетесь делать слишком сложные вещи слишком быстро - вам, вероятно, стоит взглянуть на Учебники по Java сначала - хотя они достаточно всеобъемлющие и могут также использоваться в качестве справочной информации для поиска сведений о языке. Также есть раздел о преобразовании между коллекциями и массивами . р>
Я предлагаю вам использовать IDE (например, Eclipse, совершенно бесплатно). Он поможет вам разобраться в синтаксисе API, предлагая подсказки при вводе и отображать ошибки при их вводе, чтобы вы могли точно определить синтаксические ошибки и спросить о них. С точки зрения вопроса, это то, для чего предназначен StackOverflow.
Другие опрашивают меня на ваш конкретный вопрос о синтаксисе, поэтому я просто ограничиваю свой ответ общим вопросом о том, как вы получаете помощь.
Чтобы устранить ошибки компилятора, обычно лучше начать с первой и исправить ее первой. После исправления этого, остальные ошибки компилятора также могут быть решены, или это могут быть ошибки разных типов.
Чтобы понять, что означает какая-то ошибка компилятора, есть статья под названием Compile and Ошибки времени выполнения в Java (PDF), которые проходят через различные виды сообщений об ошибках и приводят примеры того, какой код может их вызывать. А что касается сообщений об ошибках во время выполнения, в Java Glossary есть их довольно большой список . У них также есть список сообщений об ошибках во время компиляции .
Итак, ваша проблема здесь в том, что вы пытаетесь получить доступ к ArrayList как к массиву, что неверно, потому что Java не делает ничего подобного. Вам нужно использовать list.get (i), чтобы получить элемент ih в массиве. Точно так же, когда вы пытались установить переменную ArrayList в массив, компилятор разозлился на вас. Вам нужно создать новый ArrayList с содержимым temp, а затем установить для него dvdlist, например. dvdlist = new ArrayList<RatedDVD>(temp);
. Р>
Что касается ваших постоянных проблем: спецификация API для Java, которая в основном говорит вам, как использовать все классы, включенные в API Java. Например, ArrayList является общей коллекцией который имеет определенные методы и конструкторы, которые вам нужно использовать. В Java нет перегрузки операторов, поэтому вы не можете просто получить доступ к элементам списка с использованием синтаксиса массива. Кроме того, массивы имеют свой собственный тип данных, поэтому вы не можете просто рассматривать ArrayList как массив и наоборот.
Похоже, вы не понимаете разницы между массивом и ArrayList. Массив представляет собой статический список элементов и создается с использованием символов []. ArrayList - это объект в системе Collections в Java, который действует как массив с изменяемым размером - то есть он может быть проиндексирован, а также может быть добавлен, вставлен и т. Д. Они не являются взаимозаменяемыми.
Относительно того, где вы можете искать и т. д. Если это ваш первый опыт программирования, вы не одиноки. Многие ошибки компилятора менее чем полезны. Одно предложение, которое я могу вам дать, которое я выучил за многие годы проб и ошибок - начните с малого и развивайтесь. Получить основной метод, который компилируется. Затем добавьте первый маленький кусочек (например, создайте класс). Затем добавьте следующий кусок и так далее. Тестируйте, как вы идете и т. Д. Вы можете погуглить для конкретных ошибок компилятора - я был удивлен, что я нашел. Кроме того, многое из этого является методом проб и ошибок - это то, чему вы учитесь из опыта, и большая скорость & Quot; old hands & Quot; приходит из долгого опыта, чтобы увидеть, что вы можете делать неправильно снова и снова, а не какой-то врожденный интеллект. Я полностью понимаю ваше разочарование - я чувствовал себя так, когда начинал около 15 лет назад (но я был на Borland Pascal - черт).
Одна из самых больших проблем начинающих программистов, по-видимому, заключается в том, что она не может очень хорошо читать и интерпретировать сообщения об ошибках.
Вам было бы полезно внимательно изучить ошибки, которые предоставляет javac
(или любой компилятор / интерпретатор). Может быть, даже начните с некоторых ошибок, которые вы понимаете в своем коде (например, присвойте переменной неверное типизированное значение, расширьте цикл за пределами границ) и посмотрите, как ваш компилятор их обрабатывает.
Попробуйте мыслить объектно-ориентированными терминами ...
Мне кажется, что что-то (классная работа, я полагаю) подтолкнуло вас к написанию объектно-ориентированной программы, но возможно, что вы еще не приняли, что вам нужно будет думать в этих терминах.
В Java большинство вещей являются объектами, но Java поддерживает примитивные типы и массивы обоих. Программирование на Java возможно простым, процедурным, изменяемым способом, но также возможно писать объектно-ориентированным функциональным способом. Можно сделать и то и другое и запутаться, вот где вы можете быть прямо сейчас.
Вы пытаетесь смешать два стиля. Это не всегда плохо, но для курсовой работы мы можем с уверенностью заявить ферме, что ваш инструктор захочет видеть больше объектов и меньше массивов, если только эти массивы не являются частной внутренней реализацией объекта.
Так что думайте о структурах данных как о чёрных ящиках с методами, а затем посмотрите, что вы делаете, сами реализуете их.
Вы, вероятно, были здесь, но это вещи, которые вы можете сделать с ArrayList . И у вас есть ArrayList<RatedDVD>
, который еще больше ограничивает то, что вы можете с ним делать. Попытайтесь сначала понять это, а затем исправьте программу для работы с доступными операциями над объектом ArrayList.