代码之家  ›  专栏  ›  技术社区  ›  Pranav

Java中数组的排序

  •  3
  • Pranav  · 技术社区  · 15 年前

    我想把2个数组传递给Java中的函数,并在调用函数中对它们进行排序。如何使用函数来完成这一点?

    我可以让函数返回一个有两个数组的对象,但是是否有一个非面向对象的解决方案?

    编辑:我在这个特殊的情况下不能使用Java中内置的ARARY.SCOPE函数。假设这两个数组是高度和重量。它们的长度相同,相同的索引对应于同一个人在两个数组上的身高和体重。我要按升序对高度数组进行排序,同时对与高度数组相对应的权重数组进行排序。所以使用sort函数会破坏两个数组之间的关系。

    5 回复  |  直到 15 年前
        1
  •  4
  •   Mehrdad Afshari    15 年前

    将数组传递给函数时,它不会被复制。只需复制它的引用并将其传递给将指向同一位置的函数。您只需要对数组进行适当的排序。

    编辑:为了解决实际的排序问题,可以使用任何排序算法进行排序 height 数组。唯一的区别是当你交换两个元素时 高度 排序过程中,还应交换 weight 数组。

        2
  •  5
  •   Matthew Flaschen    15 年前
    public void sort2(Object o1[], Object o2[])
    {
      Arrays.sort(o1);
      Arrays.sort(o2);
    }
    

    稍微复杂一点:

    public <T> void sort2(T o1[], T o2[],  Comparator<? super T> c)
    {
      Arrays.sort(o1, c);
      Arrays.sort(o2, c);
    }
    

    编辑:通常,当您使用并行数组时,这意味着您没有正确地使用对象。为了遵循您的示例,您应该有一个具有高度和重量属性的可比较人员类。当然,正如Mehrdad所说,您可以手动实现一个并行数组排序算法,但这并不理想。

        3
  •  1
  •   rich    15 年前

    虽然使用两个单独的数组并保持它们的排序同步是可能的,但是使用这种类型的解决方案可能会导致以后很难找到的错误。例如,如果数组之间的同步无法正常工作,则可能会将错误的权重与高度匹配。

    避免此类问题的一种方法是将高度/重量封装到类中,以便它们始终保持同步。在图1中有一个名为 Person 具有高度、重量和名称作为属性的。如果总是按高度升序排序,则可以实现 compareTo() 方法如图1所示。

    图2显示了一个JUnit测试用例,演示如何对 测试用例还演示了如何按权重排序。在这两种情况下,重量和高度之间都不会出现同步问题,因为排序是在封装它们的对象上进行的。

    图1

    
    
    public class Person implements Comparable {
        private Float height;
        private Float weight;
        private String name;
    
        public Person(){}
    
        public Person(Float height, Float weight, String name) {
            this.height = height;
            this.weight = weight;
            this.name = name;
        }
    
        public Float getHeight() {
            return height;
        }
        public void setHeight(Float height) {
            this.height = height;
        }
        public Float getWeight() {
            return weight;
        }
        public void setWeight(Float weight) {
            this.weight = weight;
        }
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    
        public int compareTo(Person other) {
            //sort by height ascending
            return this.height.compareTo(other.getHeight());
        }
    }
    
    

    图2-JUnit测试类

    
    
    import junit.framework.TestCase;
    import java.util.*;
    
    public class PersonTest extends TestCase {
    
        private List personList = new ArrayList();
    
        public PersonTest(String name) {
            super(name);
        }
    
        public void testCompareTo() {
            personList.add(new Person(72F,125F,"Bob"));// expect 3rd when sorted by height asc
            personList.add(new Person(69.9F,195F,"Jack"));// expect 2nd when sorted by height asc
            personList.add(new Person(80.05F,225.2F,"Joe"));// expect 4th when sorted by height asc
            personList.add(new Person(57.02F,89.9F,"Sally"));// expect 1st when sorted by height asc
            Collections.sort(personList);
            assertEquals("Sally should be first (sorted by height asc)",personList.get(0).getName(),"Sally");
            assertEquals("Jack should be second (sorted by height asc)",personList.get(1).getName(),"Jack");
            assertEquals("Bob should be third (sorted by height asc)",personList.get(2).getName(),"Bob");
            assertEquals("Joe should be fourth (sorted by height asc)",personList.get(3).getName(),"Joe");
    
            Collections.sort(personList,new Comparator() {
                public int compare(Person p1, Person p2) {
                    //sort by weight ascending
                    return p1.getWeight().compareTo(p2.getWeight());
                }
            });
            assertEquals("Sally should be first (sorted by weight asc)",personList.get(0).getName(),"Sally");
            assertEquals("Bob should be second (sorted by weight asc)",personList.get(1).getName(),"Bob");
            assertEquals("Jack should be third (sorted by weight asc)",personList.get(2).getName(),"Jack");
            assertEquals("Joe should be fourth (sorted by weight asc)",personList.get(3).getName(),"Joe");      
        }
    
    }
    
    

        4
  •  0
  •   Ksempac    15 年前

    所以你想让函数a调用函数b,然后b对数组排序,a返回两个排序的数组?

    由于Java中引用参数,如果在B中修改对象,A将看到修改后的版本。

    在C中,它甚至可以用out关键字显式地表示,它告诉每个人函数将修改out参数。

        5
  •  0
  •   Peter Lawrey    15 年前

    可以返回数组数组或包含两个数组的对象。但是,听起来这两个数组中的值应该是相关的,因此您应该有一个包含这两个值的对象数组。

    顺便说一句:我不会使用float,我也会避免使用float(因为它只精确到6个位置),我建议使用int、long或double。