【问题标题】:is it possible to write a method to sort an array of objects with respect to a specific field?是否可以编写一种方法来对特定字段的对象数组进行排序?
【发布时间】:2014-10-26 19:16:11
【问题描述】:

我的意思是有可能有一个方法,它的参数是一个对象数组和另一个参数,它指示我们使用对象的哪个字段来对数组进行排序?

例如,如果对象是联系人,如果我们调用 sort(contacts , name),它将根据名称对它们进行排序。如果我们调用 sort(contacts , number),它会根据它们的编号对它们进行排序。 也许通过发送我们想要的字段的字符串!类似:

 class sorting {
   
   public static bubble_sort(Object[] array , String field){
     
     for(int i =0; i<array.length ; i++){
       
      if(array[i].field > array[i+1].field)
        swap(array ,i ,i+1);
     
   }
}

(最好在 java 中)(并请包括您提供的解决方案的示例!)

【问题讨论】:

  • 答案很大程度上取决于语言。你能更准确地说你在说哪种语言吗?看来您想要 Java 的答案。

标签: arrays oop sorting object


【解决方案1】:

假设这是 Java:是的,这是可能的。您可以使用reflection 获取字段类型和值,然后进行比较。这不是一个好主意。将Comparator 与现有的排序方法一起使用会更好。

【讨论】:

    【解决方案2】:

    一种几乎适用于任何语言的方法是传入某种函数对象。

    class sorting {
      public static bubble_sort(Object[] array, FunctionObject ordering) {
      for(int i =0; i<array.length ; i++){
        if(ordering(array[i+1], array[i]))
          swap(array ,i ,i+1);
      }
    };
    

    对于这样的函数对象,不同的语言会有不同的语法——它的类型是什么等等——但几乎每种语言都会有一些方法来做到这一点。

    一般来说最好的签名是接受两个不同的对象,如果左边的小于右边的则返回真。

    同样,不同的语言将有不同的方式来调用函数对象。有些可能需要ordering.Invoke( array[i+1], array[i] )

    在该函数对象中,比较有问题的字段。如果语言/对象有反射,有时您可以直接通过字段名称进行此操作。

    由于这种模式非常有用,随着语言的成熟,它们往往会变得更容易。因此,您的语言的最新版本可能有一种语法,可以用更少的语法创建此类对象,并用更少的语法调用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      相关资源
      最近更新 更多