【问题标题】:Sort integers but keep indexes to restore back their order对整数进行排序但保留索引以恢复其顺序
【发布时间】:2011-11-28 18:36:58
【问题描述】:

我希望您提出一种方法,我想对一组整数值进行排序,但要记住它们的索引。

那是我想对整数进行排序,对它们执行一些操作,然后在排序之前将它们恢复到相同的顺序。

对数据结构或算法有什么建议吗?

【问题讨论】:

  • 简单方法:对集合的副本进行排序,保留原件。
  • 请输入一个你为什么要这样做的例子??
  • 取而代之的是排序、更改和取消排序,为什么不将它们更改为它们的起点和终点?
  • 我不知道你为什么不赞成这个......这是一个完全有效的问题。在被排序的对象很大并且复制数组的成本很高的情况下呢?我会使用另一个 int 数组来存储索引,保持原始顺序并存储排序顺序列表 (+1) 的索引。

标签: java algorithm sorting data-structures


【解决方案1】:

您需要将数据及其原始索引放入一个类中,并以仅比较数据的方式定义比较。

public class SortItemHelper implements Comparable<SortItemHelper>
{
    Data data;
    int originalIndex;

    public int compareTo(SortItemHelper other)
    {
        if (other == null)
            return 1;
        return data.compareTo(other.data);
    }
    ...
}

(您需要在 Data 上将其设为泛型。)

【讨论】:

    【解决方案2】:

    这样你就可以对一个知道自己位置的对象数组(也许是你自己设计的包装类)进行排序。

    【讨论】:

      【解决方案3】:

      如果有人正在寻找一个通用的实现,我已经做了一个。

      基本抽象类:

      public abstract class AbstractSortHelper<T> implements Comparable<AbstractSortHelper<T>> {
          protected final int index;
          protected final T data;
      
          public AbstractSortHelper(int index, T data) {
              this.index = index;
              this.data = data;
          }
      
          public int getIndex() {
              return index;
          }
      
          public T getData() {
              return data;
          }
      }
      

      第一个可用于实现 Comparable 的对象的扩展类:

      public class ComparableSortHelper<T extends Comparable> extends AbstractSortHelper<T> {
      
          public ComparableSortHelper(int index, T data) {
              super(index, data);
          }
      
          @Override
          public int compareTo(AbstractSortHelper<T> o) {
              return this.data.compareTo(o.data);
          }
      }
      

      可用于未实现 Comparable 的对象的第二个扩展类。使用时你必须实现一个比较器:

      public abstract class ComparatorSortHelper<T> extends AbstractSortHelper<T> implements Comparator<T> {
      
          public ComparatorSortHelper(int index, T data) {
              super(index, data);
          }
      
          @Override
          public int compareTo(AbstractSortHelper<T> {
              return compare(this.data, o.data);
          }
      }
      

      扩展 ComparatorSortHelper 如下所示:

      class DataSortHelper extends ComparatorSortHelper<Object[]> {
      
          public DataSortHelper(int index, Object[] data) {
              super(index, data);
          }
      
          @Override
          public int compare(Object[] o1, Object[] o2) {
              return Integer.compare((Integer) o1[0], (Integer) o2[0]);
          }
      }
      

      使用这个之后,排序就简单了:

      List<DataSortHelper> list = new ArrayList<>();
      // ...
      Collections.sort(list);
      

      希望它可以帮助某人。 :)

      【讨论】:

        猜你喜欢
        • 2017-04-28
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        相关资源
        最近更新 更多