Заменить элементы массива после индекса

Позволять

A=[x1,x2,x3,y1,y2,y3,y4]

Я хочу заменить все после y1 в массивах A:

A=[x1,x2,x3,y1,y1,y1,y1]

Я попытался

for i in eachindex(A)
   if A[i]==y1
      for j in i:length(A)
        A[j]=y1
      end
   end 
end

Но это кажется сложным, есть ли другой способ сделать это проще?

Как это воспроизводимо?

Shayan 19.11.2022 06:11
Как настроить Tailwind CSS с React.js и Next.js?
Как настроить Tailwind CSS с React.js и Next.js?
Tailwind CSS - единственный фреймворк, который, как я убедился, масштабируется в больших командах. Он легко настраивается, адаптируется к любому...
LeetCode запись решения 2536. Увеличение подматриц на единицу
LeetCode запись решения 2536. Увеличение подматриц на единицу
Увеличение подматриц на единицу - LeetCode
Переключение светлых/темных тем
Переключение светлых/темных тем
В Microsoft Training - Guided Project - Build a simple website with web pages, CSS files and JavaScript files, мы объясняем, как CSS можно...
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel с методами присоединения и отсоединения
Отношения "многие ко многим" в Laravel могут быть немного сложными, но с помощью Eloquent ORM и его моделей мы можем сделать это с легкостью. В этой...
В PHP
В PHP
В большой кодовой базе с множеством различных компонентов классы, функции и константы могут иметь одинаковые имена. Это может привести к путанице и...
Карта дорог Беладжар PHP Laravel
Карта дорог Беладжар PHP Laravel
Laravel - это PHP-фреймворк, разработанный для облегчения разработки веб-приложений. Laravel предоставляет различные функции, упрощающие разработку...
2
1
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это то, что вы хотите? В примере я предполагаю, что ваш y1 — это 1.

julia> A = [5, 4, 3, 1, 2, 7, 8]
7-element Vector{Int64}:
 5
 4
 3
 1
 2
 7
 8

julia> loc = findfirst(==(1), A)
4

julia> isnothing(A) || (A[loc:end] .= 1);

julia> A
7-element Vector{Int64}:
 5
 4
 3
 1
 1
 1
 1

Если findfirst('s', "first") == 4, то почему у нас не может быть findfirst(1,A)==4? Это кажется естественным. Была ли какая-то причина, по которой этот особый случай не был реализован?

Dan Getz 19.11.2022 00:49
let found = false ; [ found || x==1 ? ( found = true ; 1 ) : x for x in A] end тоже работает (просто добавляет разнообразия)
Dan Getz 19.11.2022 00:54

Вы можете добавить это в ответ? @DanGetz

A. T 19.11.2022 10:39

@DanGetz, потому что для поиска в строках существует фиксированный набор вещей, которые вы можете искать. Если вы напишете findfirst(x, A) в общем случае, будет двусмысленно, если x является значением, которое вы ищете, или функцией предиката, которую нужно применить.

Bogumił Kamiński 19.11.2022 12:09
Ответ принят как подходящий

Если вы просто хотите исправить свой собственный код вместо другого подхода:

for i in eachindex(A)
   if A[i]==y1
      for j in i+1:lastindex(A)
        A[j]=y1
      end
      break # this is important 
   end 
end

Оператор break выходит из текущего цикла. Он также должен быть очень эффективным. Я также заменил length(A) на lastindex(A), чтобы сделать его более общим, поскольку вы уже используете eachindex.

Это будет быстро. Возможно, внутренний цикл можно заменить на @views fill!(A[i+1:lastindex(A)], y1)

Dan Getz 19.11.2022 14:52

@DanGetz, есть ли какая-то конкретная причина не использовать end вместо lastindex(A)?

Shayan 22.11.2022 23:03

@fandak end должно быть в порядке (просто скопировал из ответа).

Dan Getz 22.11.2022 23:08

Другие вопросы по теме