Java 通过指定存储的对象的一个参数从链表中删除节点
我希望我的问题不会让你厌烦。我的任务是创建一个菜单和投票系统,我试图动态地将候选人添加到一个链接列表中,候选人的姓名和政党是唯一的参数。在菜单中,如果用户希望删除候选对象,我可以选择删除该候选对象,因此系统会提示用户输入该候选对象的名称(假定该名称是唯一的),然后应删除包含该对象的节点。这就是我迄今为止所做的:Java 通过指定存储的对象的一个参数从链表中删除节点,java,list,Java,List,我希望我的问题不会让你厌烦。我的任务是创建一个菜单和投票系统,我试图动态地将候选人添加到一个链接列表中,候选人的姓名和政党是唯一的参数。在菜单中,如果用户希望删除候选对象,我可以选择删除该候选对象,因此系统会提示用户输入该候选对象的名称(假定该名称是唯一的),然后应删除包含该对象的节点。这就是我迄今为止所做的: package votingEntities; import java.util.*; public class CandidateMakerMenu {
package votingEntities;
import java.util.*;
public class CandidateMakerMenu
{
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args)
{
int menuChoice = 0;
//int numOfCandidates = 0;
int candidates = 0;
String nameOfCandidate;
String partyOfCandidate;
LinkedList candidateList = new LinkedList();
do
{
System.out.println("Please Choose an Option:\n");
System.out.println("\t1. Add Candidate\n"
+ "\t2. List Candidates\n"
+ "\t3. Delete Candidate\n"
+ "\t4. Vote\n"
+ "\t5. Results\n"
+ "\t6. New Election\n"
+ "\t7. Exit\n");
menuChoice = EasyIn.getInt();
switch (menuChoice)
{
case 1:
System.out.println("\nName of candidate "+(candidates+1)+" : ");
nameOfCandidate = EasyIn.getString();
if(candidateList.indexOf(nameOfCandidate) != -1)
{
System.out.println("\nCandidate name has to be unique, please choose different name\n");
break;
}
System.out.println("\nParty of candidate "+(candidates+1)+" : ");
partyOfCandidate = EasyIn.getString();
Candidate c = new Candidate(nameOfCandidate,partyOfCandidate);
candidateList.add(c);
candidates++;
System.out.println("\nNumber of Candidates: "+candidates);
break;
case 2:
if(candidates < 1)
{
System.out.println("\nNo candidates in list yet\n");
break;
}
System.out.println(candidateList);
break;
case 3:
if(candidates < 1)
{
System.out.println("\nNo candidates to delete\n");
break;
}
System.out.println("\nEnter name of candidate to delete: ");
nameOfCandidate = EasyIn.getString();
int candidateIndex =candidateList.indexOf(nameOfCandidate);
if(candidateIndex == -1)
{
System.out.println("\nCandidate can not be found in list\n");
break;
}
else
{
candidateList.remove(candidateIndex);
candidates--;
}
case 4:
break;
case 5:
break;
case 6:
candidateList.clear();
break;
case 7:
System.exit(0);
default:
System.out.println("\nChoice must be a value between 1 and 6.\n");
}
}
while(menuChoice != 7);
}
所以我的问题是案例3,我不明白为什么它不移除对象。我对实现链表还不熟悉,所以我知道这可能有点愚蠢,但我希望得到任何提示。您正在尝试使用候选名称删除。字符串也是一个对象。所以,您正在比较字符串对象和候选对象。如果使用泛型链表,它将抛出编译时错误,所以使用泛型链表
LinkedList<Candidate> candidateList = new LinkedList<Candidate>();
使用迭代器删除对象
for(Iterator<Candidate> iter = list.iterator(); iter.hasNext();) {
Candidate data = iter.next();
if (data.name.equalIgnoreCase(nameOfCandidate) {
iter.remove();
}
}
如果有意义,您可以在候选类上定义相等,以便在名称相同时返回true:
class Candidate {
String name; // or whatever is is really is your class
String party; // same as abover
...
public boolean equals(Object other) {
if (! (other instanceof Candidate)) {
return false;
}
return name.equals(((Candidate) other).name);
}
public int hash() {
return name.hash();
}
}
这样,您就可以成功地在候选列表上使用indexOf来查找Candidate的名称:
谢谢大家,@Exbury我用了你们的方法,效果非常好
case 3:
if(candidates < 1)
{
System.out.println("\nNo candidates to delete\n");
break;
}
System.out.println("\nEnter name of candidate to delete: ");
nameOfCandidate = EasyIn.getString();
Candidate cToDelete = new Candidate(nameOfCandidate, "anyPartyName");
int candidateIndex =candidateList.indexOf(cToDelete);
if(candidateIndex == -1)
{
System.out.println("\nCandidate can not be found in list\n");
break;
}
else
{
candidateList.remove(candidateIndex);
candidates--;
}
看起来您的列表包含候选对象,但您正在尝试将字符串传递到indexOf。因此indexOf将始终返回-1,因为候选项不等于字符串。您可能需要实际循环遍历候选项以找到具有匹配名称的候选项。谢谢@khelwood,我将尝试解决以下问题:案例3:ifcandidates<1{System.out.println\n没有要删除的候选项\n;break;}System.out.println\n输入要删除的候选项的名称:;nameOfCandidate=EasyIn.getString;forIterator iter=candidateList.iterator;iter.hasNext;{Candidate data=iter.next;if data.getCandidateName.equalsIgnoreCasenameOfCandidate{iter.remove;candidates-;}否则{System.out.printlcandidate找不到;}}噢,伙计,很抱歉,我没有意识到这会是这样的,但无论如何,它仍然在给我候选者未发现您是正确的,但candidateList.indexOfnameOfCandidate它将始终返回-1是的,我理解,现在,我正在比较字符串和对象。我想我理解您的方法,我感谢您的时间。当然,必须有一种更简单的方法来遍历列表中的对象,将用户名与candidateObject.getName进行比较,如果找到,则返回该对象的索引。我的假设是错误的吗?@PrOjEkTeD:Exbury向您展示了如何遍历列表,删除节点可能就是这样做的。我补充了这一点作为回答,因为正如khelwood和exbury所说的那样,您错误地在删除时使用了indexOf,并且还用于控制名称是否已经在使用。如果像我在上面展示的那样实现equals和hashcode,那么您将能够在列表中使用contains或indexOf。
case 3:
if(candidates < 1)
{
System.out.println("\nNo candidates to delete\n");
break;
}
System.out.println("\nEnter name of candidate to delete: ");
nameOfCandidate = EasyIn.getString();
Candidate cToDelete = new Candidate(nameOfCandidate, "anyPartyName");
int candidateIndex =candidateList.indexOf(cToDelete);
if(candidateIndex == -1)
{
System.out.println("\nCandidate can not be found in list\n");
break;
}
else
{
candidateList.remove(candidateIndex);
candidates--;
}