В то время как-то контур

Конечно, это невозможно в java (в настоящее время), но в идеале я хотел бы реализовать его, поскольку он лежит в основе многих итераций. Например, первый раз, когда он называется, я делаю это 650 000+ раз, когда он создает ArrayList. К сожалению, реальность такова, что мой фактический код не имеет set внутри цикла else; таким образом, он будет передавать команды add, а затем set и тратить время.

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

ArrayList<Integer>  dataColLinker = new java.util.ArrayList<Integer>();
...
...
public void setLinkerAt( int value, int rowIndex) {
    ...
    while(rowIndex >= dataColLinker.size()) {
        dataColLinker.add(value);
    } else {
        dataColLinker.set(rowIndex, value);
    }

Любые идеи или теории? Я не уверен в скорости в java, когда речь заходит о операторах if и ArrayList и т.д.

Ответ 1

Я что-то пропустил?

Не этот гипотетический код

while(rowIndex >= dataColLinker.size()) {
    dataColLinker.add(value);
} else {
    dataColLinker.set(rowIndex, value);
}

означает то же самое, что и это?

while(rowIndex >= dataColLinker.size()) {
    dataColLinker.add(value);
}
dataColLinker.set(rowIndex, value);

или это?

if (rowIndex >= dataColLinker.size()) {
    do {
        dataColLinker.add(value);
    } while(rowIndex >= dataColLinker.size());
} else {
    dataColLinker.set(rowIndex, value);
}

(Последнее имеет больше смысла... я думаю). В любом случае, очевидно, что вы можете переписать цикл так, чтобы "else test" не повторялся внутри цикла... как я только что сделал.


FWIW, это, скорее всего, случай преждевременной оптимизации. То есть вы, вероятно, тратите время на оптимизацию кода, который не нужно оптимизировать:

  • Насколько вам известно, оптимизатор компилятора JIT, возможно, уже переместил код так, что часть "else" больше не находится в цикле.

  • Даже если это не так, есть вероятность, что конкретная вещь, которую вы пытаетесь оптимизировать, не является значительным узким местом... даже если она может быть выполнена 600 000 раз.

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

Ответ 2

Я не понимаю, почему существует некоторая инкапсуляция...

Использование

//Use the appropriate start and end...
for(int rowIndex = 0, e = 65536; i < e; ++i){        
    if(rowIndex >= dataColLinker.size()) {
         dataColLinker.add(value);
     } else {
        dataColLinker.set(rowIndex, value);
     }    
}

Ответ 3

Оберните оператор "set", чтобы он означал "set if not set" и поставил его обнаженным над циклом while.

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

Ответ 4

boolean entered = false, last;
while (( entered |= last = ( condition ) )) {
        // Do while
} if ( !entered ) {
        // Else
}

Добро пожаловать.

Ответ 5

В Java нет этой структуры управления.
Следует отметить, однако, что другие языки. Например, Python имеет конструкцию while-else.

В случае Java вы можете подражать этому поведению, как вы уже показали:

if (rowIndex >= dataColLinker.size()) {
    do {
        dataColLinker.add(value);
    } while(rowIndex >= dataColLinker.size());
} else {
    dataColLinker.set(rowIndex, value);
}

Ответ 6

Этот оператор while должен выполнять только код else, когда условие является ложным, это означает, что он всегда будет выполнять его. Но есть уловка, когда вы используете ключевое слово break в цикле while, инструкция else не должна выполняться.

Код, который удовлетворяет условию, является только:

boolean entered = false;
while (condition) {
   entered = true; // Set it to true stright away
   // While loop code


   // If you want to break out of this loop
   if (condition) {
      entered = false;
      break;
   }
} if (!entered) {
   // else code
}

Ответ 7

Предполагая, что вы приходите с Python и принимаете это как одно и то же:

def setLinkerAt(value, rowIndex):
    isEnough = lambda i: return i < dataColLinker.count()
    while (not isEnough(rowIndex)):
        dataColLinker.append(value)
    else:
        dataColLinker[rowIndex] = value 

Самое похожее, что я мог придумать, было:

public void setLinkerAt( int value, int rowIndex) {
    isEnough = (i) -> { return i < dataColLine.size; }
    if(isEnough()){
        dataColLinker.set(rowIndex, value);
    }
    else while(!isEnough(rowInex)) {
        dataColLinker.add(value);
    }

Обратите внимание на необходимость логики и обратной логики. Я не уверен, что это отличное решение (дублирование логики), но безусловный else - это самый близкий синтаксис, который я мог бы придумать, сохраняя тот же самый поступок, что не выполнял логику больше, чем требовалось.