嘿,谢谢你花时间看我的代码!我非常感谢你。为了给大家一点背景知识,我之前为一个任务创建了一个口袋妖怪排序数组。现在,下一个任务是做所有相同的事情,除了使用链表(不导入自动工具,我们从头开始)。就我所知,这只需要在循环时为链表切换基于数组的for循环。问题出在这里。我的计数方法已经破坏了我的代码几个小时了,现在我知道该怎么做了。该方法应该将一个布尔示例作为参数,并将其与我列表中的口袋妖怪进行比较(我的布尔示例变量是watertype,然后返回与之匹配的口袋妖怪数量)。我试着用3参数构造函数在方法内部构造一个新的口袋妖怪,只填充布尔示例,同时保留字符串和int“null”和“0”,但这会在线程“main”java.lang.nullpointerexception:无法调用“string.tolowercase()”,因为orderedlistapp/orderedlistapp.pokemon.compareto(pokemon.java:58)和orderedlistapp/orderedlistapp.pokemonlinkedlist.CountOccents(pokemonlinkedlist.java:64)处的“temp.name”为nullorderedlistapp/orderedlistapp.driver.main(driver.java:22)“然后我尝试在方法中创建一个新的口袋妖怪,该方法与我列表中的口袋妖怪完全匹配所有三个变量,现在程序甚至不会终止。如果我在运行时将该方法放在其他方法之前,其他方法甚至不会输出。如果这里有人有什么想法,我一定会很感激的!另外,请原谅我所有被注解掉的部分,这些是我尚未更新为链表格式(或尝试更新)的方法。
package orderedListApp;
public class Pokemon {
private String name;
private int hp;
private boolean waterType;
public Pokemon(String name, int hp, boolean waterType) {
this.name= name;
this.hp = hp;
this.waterType = waterType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public boolean isWaterType() {
return waterType;
}
public void setWaterType(boolean waterType) {
this.waterType = waterType;
}
public int compareTo(String anotherString) {
return name.compareTo(anotherString);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Pokemon other = (Pokemon) obj;
if (!this.name.equalsIgnoreCase(other.name)) {
return false;
}
return true;
}
public int compareTo(Pokemon temp) {
return this.name.toLowerCase().compareTo(temp.name.toLowerCase());
}
@Override
public String toString() {
String output = "";
output += name + "\t\t" + hp + "\t\t" + waterType;
return output;
}
}
package orderedListApp;
public class PokemonNode {
private PokemonNode link;
private Pokemon data;
public PokemonNode(Pokemon data, PokemonNode link) {
this.link = link;
this.data = data;
}
public PokemonNode getLink() {
return link;
}
public void setLink(PokemonNode link) {
this.link = link;
}
public Pokemon getData() {
return data;
}
public void setData(Pokemon data) {
this.data = data;
}
}
package orderedListApp;
import java.util.Iterator;
public class PokemonLinkedList implements Iterable<Pokemon> {
PokemonNode head;
// variable to store size
int manyItems;
// constructor
public PokemonLinkedList() {
head = null;
manyItems = 0;
}
public void insert(Pokemon poke) {
if (head == null) {
head = new PokemonNode(poke, null);
} else if (poke.compareTo(head.getData()) < 0) {
head = new PokemonNode(poke, head);
} else {
PokemonNode previous = findPreviousNode(poke);
previous.setLink(new PokemonNode(poke, previous.getLink()));
}
manyItems++;
}
private PokemonNode findPreviousNode(Pokemon poke) {
PokemonNode cursor = head;
while (cursor.getLink() != null && cursor.getData().compareTo(poke) < 0)
;
{
cursor = cursor.getLink();
}
return null;
}
// method to return total number of pokemon in the list
public int size() {
return this.manyItems;
}
public void removePokemon(Pokemon poketoRemove) {
if (head != null && head.getData().equals(poketoRemove)) {
head = head.getLink();
} else if (head != null) {
PokemonNode previous = findPreviousNodeRemove(poketoRemove);
previous.setLink(previous.getLink().getLink());
}
}
private PokemonNode findPreviousNodeRemove(Pokemon pokeToRemove) {
PokemonNode cursor = head;
while (cursor.getLink() != null && !cursor.getData().equals(pokeToRemove)) {
cursor = cursor.getLink();
}
return cursor;
}
public int countOccurrences(boolean b) {
PokemonNode cursor = head;
int count = 0;
Pokemon poke = new Pokemon(null, 0, true);
while (cursor != null) {
if (cursor.getData().compareTo(poke) == 0)
cursor = cursor.getLink();
count++;
}
return count;
}
// public boolean contains(Pokemon oneThing) {
// for(int i=0; i<size; i++){
// if(pokemon[i].equals(oneThing))
// return true;
// }
// return false;
// }
// public int total() {
// int total = 0;
// for(int i=0; i<size; i++){
// total += pokemon[i].getHp();
// }
// return total;
// }
// public int countRange(int low, int high) {
// if(low>high)
// return 0;
// int count = 0;
// PokemonNode cursor = head;
// while(cursor != head) {
// if(cursor )
// }
//
// return count;
//
// for(int i=0; i<size; i++){
// if(pokemon[i].getHp()>=low && pokemon[i].getHp()<=high)
// count++;
// }
// return count;
// }
// toString method
@Override
public String toString() {
String output = "Type" + "\t\t" + "Hp" + "\t\t" + "Water type" + "\n";
output += "------------------------\n";
PokemonNode cursor = head;
while (cursor != null) {
output += cursor.getData() + "\n";
cursor = cursor.getLink();
}
return output;
}
private class PokemonIteratorClass implements Iterator<Pokemon> {
int cursor = 0;
@Override
public boolean hasNext() {
return cursor < manyItems;
}
@Override
public Pokemon next() {
return head.getData();
}
}
@Override
public Iterator<Pokemon> iterator() {
// TODO Auto-generated method stub
return null;
}
// public Iterator<Pokemon> iterator() {
// Iterator<Pokemon> it = new Iterator<Pokemon>() {
// private int currentIndex = manyItems-1;
// @Override
// System.out.println("LinkedList elements:");
// while(it.hasNext()){
// System.out.println(it.next());
// };
// return it;
// }
// }
}
package orderedListApp;
public class Driver {
public static void main(String[] args) {
// PokemonOrderedList pokemon = new PokemonOrderedList(10);
PokemonLinkedList pokemon2 = new PokemonLinkedList();
pokemon2.insert(new Pokemon("Pikachu", 2, false));
pokemon2.insert(new Pokemon("Gigachu", 2, true));
// pokemon.insert(new Pokemon("Pikachu ", 2, false));
// pokemon.insert(new Pokemon("Squirtle", 3, true));
// pokemon.insert(new Pokemon("Geodude ", 2, false));
// pokemon.insert(new Pokemon("Meowth ", 2, false));
// pokemon.insert(new Pokemon("Magicarp", 1, true));
System.out.println("Collection size: " + pokemon2.size());
System.out.println(pokemon2);
System.out.println("Water types: " + pokemon2.countOccurrences(true));
// System.out.println("Find Pokemon: "+pokemon.find("Magicarp"));
// System.out.println("Contains Geodude?: "+pokemon.contains(new Pokemon("Geodude ", 2, false)));
// System.out.println("Contains Onyx?: "+pokemon.contains(new Pokemon("Gremlin", 2, false)));
// System.out.println("Total hp: "+pokemon.total());
// System.out.println("Average hp is: " + pokemon.average());
// System.out.println("Number of pokemon with hp between the entered range: " + pokemon.countRange(1, 30));
}
}
1条答案
按热度按时间46scxncf1#
你现在
CountOccurences()
代码相当混乱。它似乎总是增加计数,而不考虑waterType
变量,并且仅当满足奇数条件时才在列表中继续。请尝试以下方法:这将检查
waterType
每个口袋妖怪的值等于查询布尔值b
,如果是,则在计数中添加一个。