В то время как-то контур
Конечно, это невозможно в 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
- это самый близкий синтаксис, который я мог бы придумать, сохраняя тот же самый поступок, что не выполнял логику больше, чем требовалось.