在一个多次调用的函数中对数组进行一次排序

时间:2011-09-26 07:39:30

标签: java arrays string sorting

这可能吗?

我有一个函数接受用户字符串,然后分成一个单词数组。我要对数组进行排序并将其重复删除。

但是,它将用于在迭代步骤中调用的函数中。它实际上遍历数据库并检查每个字段中用户定义字符串中的每个单词。

我想只对数组进行一次排序和重复数据删除,但是为该类的特定实例调用多次函数。我应该将排序的数组存储在静态实例变量中吗?

感谢您的时间


我的代码是这样的(伪代码):

  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 个答案:

答案 0 :(得分:2)

没有。更改多次调用的方法的签名,使其接受数组,并在调用方法之前计算数组:

而不是

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

使用类似的东西:

String s = "...";
String[] array = computeTheArrayFormTheString(s);
while (someCondition) {
    someMethodCalledMultipleTimes(array);
}

答案 1 :(得分:1)

如果所有这些都发生在同一个线程中,您可以使用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
}

答案 2 :(得分:1)

  

我应该只将已排序的数组存储在静态实例变量

“静态实例变量”是矛盾的。

您几乎肯定不应该将其存储在静态变量中。

可能将其存储在实例变量中。这可能会对线程安全产生影响(不知道这是否与您的情况相关)。

如果迭代是由同一个类中定义的函数执行的,那么在外部函数内部进行排序可能是有意义的,并且每次调用它时只需将已排序的数组传递给内部函数。

答案 3 :(得分:0)

您可以将它存储在非静态实例变量中(没有静态实例变量 - 这些是相反的事情)。

如果您的应用程序不是多线程的,您可以在第一次进行排序和重复数据删除而不是存储结果。 (如果它是多线程的,则相同,但是你需要使用某种锁定)。