Сортировка массива один раз в функции, которая вызывается много раз - PullRequest
0 голосов
/ 26 сентября 2011

Возможно ли это?

У меня есть функция, которая принимает строку пользователя, а затем разбивается на массив слов.Я собираюсь отсортировать массив и дублировать его.

Однако он будет использоваться в функции, которая вызывается на итерационном этапе.Он фактически перебирает базу данных и проверяет, что каждое слово в пользователе определяет строку в каждом поле.

Я бы хотел отсортировать и де-дуплицировать массив только один раз, но вызвать функцию многие для этого конкретного экземпляра класса.Должен ли я просто хранить отсортированный массив в статической переменной экземпляра?

Спасибо за ваше время


Мой код выглядит примерно так (псевдокод):

  public class searchAssistant{
        private float mScores[][];
        private Cursor mCursor; 

        public searchAssistant(Cursor c){
            mCursor = c; 
        }

        private float scoreType1(String typeFromCursor, String typeFromUser){
             if (typeFromCursor == typeFromUser) {return 1}
             else {return 0}

        }

       //similar method for type scoreType2 but sorting an array



       private int[] scoreAll(){
          int 1 = 0; 

         do {
             mScores = ScoreType1(mCursor.getString(), smomeString) + scoreType2(...);
              itr++;
            } while(cursor.moveToNext)
            return mScores;
       }

 }

это неправильный способ делать вещи?

Ответы [ 4 ]

2 голосов
/ 26 сентября 2011

Нет. Измените подпись метода, вызываемого несколько раз, чтобы он принимал массив, и вычислите массив перед вызовом метода:

Вместо

String s = "...";
while (someCondition) {
    someMethodCalledMultipleTimes(s);
}

Используйте что-то вроде этого:

String s = "...";
String[] array = computeTheArrayFormTheString(s);
while (someCondition) {
    someMethodCalledMultipleTimes(array);
}
1 голос
/ 26 сентября 2011

Стоит ли хранить отсортированный массив в статической переменной экземпляра

"Статическая переменная экземпляра" - оксюморон.

Вы почти наверняка не должны хранить егов статической переменной.

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

Если итерация выполняется функцией, определенной в том же классе, может иметь смысл выполнить сортировку внутри этоговнешней функции и просто передайте отсортированный массив внутренней функции каждый раз, когда вы вызываете ее.

1 голос
/ 26 сентября 2011

Если все это происходит в одном потоке, вы можете использовать ThreadLocal для сохранения состояния сортировки:

private static final ThreadLocal<Boolean> SORT_STATE = new ThreadLocal<Boolean>(){
    protected Boolean initialValue(){return Boolean.FALSE;}
};
public void doSomething(String[] array) {
    if(!SORT_STATE.get().booleanValue()){
        // then sort the array here
        SORT_STATE.set(Boolean.TRUE);
    }
    // now do everything else
}
0 голосов
/ 26 сентября 2011

Вы бы сохранили его в нестатической переменной экземпляра (нет такой вещи, как статическая переменная экземпляра - это противоположные вещи).

Если ваше приложение не является многопоточным, вы можете выполнить сортировку и дедупликацию в первый раз, а затем сохранить результат. (То же самое, если он многопоточный, но тогда вам нужно использовать какую-то блокировку).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...