Сортировка нескольких массивов - PullRequest
0 голосов
/ 03 марта 2012

Итак, у меня есть 3 массива, один из которых представляет собой строковый массив, а 2 - целые массивы.

Теперь я должен отсортировать их все, когда сортирую один.

Например:

String[] stringarr = {"a", "z", "b"};
int[] intarra = {5, 8, 2};
int[] intarrb = {0, 7, 1};

Я хочу отсортировать их по интарре.

Я могу использовать

Arrays.sort(intarra);

Что возвращает

intarra == {2, 5, 8};

Но как мне отсортировать другие массивы так, чтобы

stringarr == {"b", "a", "z"};
intarrb == {1, 0, 7};

Или я должен использовать что-то еще для хранения данных?

Массив строк является заголовком события, а массивы int - временем события.

Ответы [ 5 ]

2 голосов
/ 03 марта 2012

Это легко сделать с помощью ООП.Создайте структуру, содержащую ваши данные, и укажите метод сортировки:

public class MyStructure implements Comparable
{
     public String string;
     public int int1;
     public int int2;

     public int compareTo(Object obj)
     {
          if (obj instanceof MyStructure)
          {
              return ((MyStructure) obj.int1) - int1;
          }
          return 0;
     }

}

Теперь создайте массив этих структур и отсортируйте этот массив.

1 голос
/ 03 марта 2012

Это просто - вам нужно написать метод, который будет принимать ваши массивы (список массивов, массивы массивов или var arg массивов) и сортировать первый из них, что приведет к изменению индексов элементов и в других массивах.

0 голосов
/ 03 марта 2012

Jixi спросил: «Или я должен использовать что-то еще для хранения данных?»

Да, вы должны.Я рекомендую вам создать новый класс, который будет хранить все три вещи:

public class TimedEvent implements Comparable<TimedEvent> {
    String title;
    int time1, time2;

    public TimedEvent(String name, int t1, int t2) {
        title = name;
        time1= t1;
        time2=t2;
    }

    public int compareTo(TimedEvent otherEvent) {
        return title.compareTo(otherEvent.title);
    }
}

Теперь Arrays.sort будет работать для вас:

TimedEvent[] eventArray = new TimedEvent[5000];
// lots of events get stored.
eventArray[0] = new TimeEvent("Start", 125,134);
eventArray[1] = new TimeEvent("FireClose", 128,139);
eventArray[2] = new TimeEvent("Important Action", 1328,1339);

Arrays.sort(eventArray)

Обратите внимание, что любой элемент массива, который выне инициализировать будет null, и это будет выдавать исключение при попытке сортировки.Поэтому убедитесь, что длина массива именно то, что вам нужно.Если вы не знаете, сколько событий вы будете хранить заранее, используйте вместо этого ArrayList:

ArrayList<TimedEvent> eventList = new ArrayList<>(); //java7 syntax. use                         
                                 // new ArrayList<TimedEvent>(); if using Java 6.
// lots of events get stored.
eventList.add(new TimeEvent("Start", 125,134));
eventList.add(new TimeEvent("FireClose", 128,139));
eventList.add(new TimeEvent("Important Action", 1328,1339));

Collections.sort(eventList);
0 голосов
/ 03 марта 2012

Создайте класс для инкапсуляции трех упомянутых вами полей.

class MyClass{
String input:
int a;
int b;
}

Затем, в зависимости от того, хотите ли вы отсортировать по строке или целым числам, создайте соответствующий компаратор, который будет сравнивать это поле и даст вам отсортированный массив.

ArrayList<MyClass> a;
Collections.sort(a, new Comparator<MyClass> {
int compareTo(MyClass a, MyClass b){
a.getInt1()-b.getInt2();
}

Преимущество использования Comparator заключается в том, что в соответствии с вашим сценарием вы можете сортировать как по строчкам, так и по целым числам.

0 голосов
/ 03 марта 2012

Рекомендуемый способ Java - не поддерживать 3 отдельных массива, а создать список объектов и использовать Collections.sort() для сортировки объектов (не уверен, возможно ли это для вашего варианта использования).Следовательно, все свойства всегда будут синхронизированы.Ваш объект должен реализовывать интерфейс Comparable и, следовательно, вы будете вынуждены переопределить метод compareTo()

public class MySortable implements Comparable {
   private String strVal;
   private int intVala;
   private int intValb;

   public int compareTo(MySortable other) {
      // Use Integer's compareTo method instead of writing your own logic
      return Integer.valueof(intVala).compareTo(Integer.valueOf(other.intVala));
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...