Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过指定存储的对象的一个参数从链表中删除节点_Java_List - Fatal编程技术网

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