Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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_Multithreading_Sorting_Runnable - Fatal编程技术网

Java 为了阻止输出包含重复对象,需要对代码进行哪些更改

Java 为了阻止输出包含重复对象,需要对代码进行哪些更改,java,multithreading,sorting,runnable,Java,Multithreading,Sorting,Runnable,程序根据对象的名称对对象进行排序。程序使用多线程,但当我使用它时,输出包含列表中第一项的副本。在添加多线程(特别是可运行)之前,程序运行良好。不过,在对列表进行排序之后,就会出现错误 这是包含排序方法的ClassRank类的一部分: public List<Student> nameOrder(List<Student> students) { //Keeps sorting until sorted. boolean notSor

程序根据对象的名称对对象进行排序。程序使用多线程,但当我使用它时,输出包含列表中第一项的副本。在添加多线程(特别是可运行)之前,程序运行良好。不过,在对列表进行排序之后,就会出现错误

这是包含排序方法的ClassRank类的一部分:

public List<Student> nameOrder(List<Student> students)
    {
        //Keeps sorting until sorted.
        boolean notSorted = true;       

        while (notSorted)
        {
            //Count keeps track of how many items are in order.
            int count = 1;

            for (int i = 0; i < students.size() - 1; i++)
            {

                //nameFront is a name ahead of the nameBehind in the list.
                String nameFront = students.get(i).getName();
                String nameBehind = students.get(i + 1).getName();
                //Determines lexicographical relationship between the names.
                if (nameFront.compareToIgnoreCase(nameBehind) > 0 )
                {
                    Student studentFront = students.get(i);
                    students.set(i, students.get(i + 1));
                    students.set(i + 1, studentFront);
                }
                else if (nameFront.compareToIgnoreCase(nameBehind) == 0)
                {
                    double frontWorth = students.get(i).pointValue();
                    double behindWorth = students.get(i + 1).pointValue();
                    if(frontWorth < behindWorth)
                    {
                        Student studentFront = students.get(i);
                        students.set(i, students.get(i + 1));
                        students.set(i + 1, studentFront);
                    }
                }
                else
                {
                    count++;
                }
                try {
                    Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
                }

            }
            if (count ==  students.size())
            {
                notSorted = false;
            }           
        }   
        return students; 
    }

这段代码可能会产生这样的结果,抛出一个
ConcurentModificationException
或显示未排序的ArrayList.ArrayList不能同时访问,因此您将获得一些有趣的效果。在打印结果之前,您需要等待线程的执行完成。请尝试在
name.start()之后添加
name.join()
。为什么要在排序中休眠线程?它看起来像是冒泡排序的低效实现,而不是多线程排序。通常不允许一个线程在另一个线程迭代集合时修改集合。
List<Student> list1 = new ArrayList<Student>();
//students is the list made from extracting the data file with
        //the objects
        for(Student student: students)
        {
            list1.add(student);
        }
ClassRank listNames = new ClassRank();
Thread name = new Thread(new Runnable()
        {
            public void run()
            {
                //Command to sort students alphabetically
                listNames.nameOrder(list1);
            }
        });
        name.start();
        for (Student i : list1)
        {
            System.out.println(i.toString());
        }
        System.out.println();
Matthew Diaz      3.6 1420 3
Carl Baab         1.6 750 2
Connor Morgan     3.2 1260 3
Daniel Deyoung    2.8 460 3
David Navas       2.9 1450 1
Dominic Mazza     3.9 1460 3
Ethan Gieger      3.5 1310 3
George Scaglione  3.5 1300 1
Hayle Short       3.8 1410 7
Jake Orlick       4.0 1340 5
Joshua Saunders   3.5 1510 7
Matthew Diaz      3.6 1420 3
Robert Dick       3.8 1460 2
Samuel Rodriguez  3.8 1360 3