Podwójna pętla for oraz if

Podwójna pętla for oraz if
EB
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Postów:15
0

Cześć!
Wyszukuje sobie rzeczy między listami 1 i 2 i jeżeli to znajdę powtarzającą się wartość w obu tych listach, to dodaje coś z listy 2 do listy 3. Niestety może być tak że lista 1 będzie posiadała coś czego nie posiada lista 2, w takim wypadku chciałem dodać do listy 3 np wartość "pusto" bądź "nieznaleziono". Nie wiem jak to rozgryźć, jakieś porady? Myślałem o wstawieniu if jak "i" dojdzie do maxa, ale co jeżeli akurat w ostatnim wierszu znajdzie te coś? Nie wiem nawet jak to w wujka google wpisać :(

Kopiuj
     for (int j = 0; j < Lista1.Count; j++)
          {


              for (int i = 0; i < Lista2.Count-3; i++) //wyszukiwanie BPP kolejnych punktów
              {
                  if (Lista1[j] == Lista2[i])
                  {

                     Lista3.Add(Lista2[i + 3];
                     break;
                  }
                  // Coś tutaj zrób

              }
          }


M9
  • Rejestracja:około 4 lata
  • Ostatnio:prawie 4 lata
  • Postów:42
1
Kopiuj
else if (i + 1 == Lista2.Count-3) {
   Lista3.Add("Pusto");
}
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2155
1

Rozumiem, że jak coś się znajduje w obu listach, to pod tym samym indeksem? Jeśli nie to masz "błąd" w pierwszym if.

Kopiuj
if (Lista1[j] == Lista2[i])

Nie potrzebujesz do tego pętli żeby wyciągnąć takie rzeczy.

Kopiuj
var Lista3 = Lista1.Where(x=> Lista2.Any(y=>y == x));

lub (w zależności gdzie co ma się powtarzać

Kopiuj
var Lista3 = Lista2.Where(x=> Lista1.Any(y=>y == x));

EDIT
To pierwsze nieaktualne. Teraz dopiero zobaczyłem, że tam jest j 🤦‍♂️

edytowany 2x, ostatnio: AdamWox
EB
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Postów:15
0

@AdamWox: Taak stosowałem to rozwiązanie dopóki się nie ogarnąłem, że nie działa jeżeli dana wartość się powtarza, a działając na współrzędnych niestety często się powtarzają :D I niestety nie są na tych samych indexach, tylko właśnie są różne rozlokowane dlatego jest podwójna pętla "i" oraz "j" która przeszukuje obydwie te listy. :)
Zastanawiam się tylko czyy można np przerwać wewnętrzną funkcję jak znajdzie L1[j] = L2[i] i wskoczyć do zewnętrznej żeby kontynuowała dalej L1[j+1] ? Na pewno skróciłoby to czas tych pętli bo nawet jak znajdzie na 1 pozycji w j=1 i i=1 to i tak przelatuje i do końca.

AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2155
0

Tylko po co pętla skoro możesz zrobić to co ja ci napisałem? Jeśli Lista3 jest pusta to nie ma powtórek i nie potrzebujesz żadnej pętli, jedna linia, problem rozwiązany...

EB
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Postów:15
0

@AdamWox: No dobrze, tylko że interesuje mnie kolejność z listy 1, a dane z listy 2. W twoim wypadku po prostu przeleci wszystkie i znajdzie te które istnieją i je sobie pododaje do Listy 3 jak rozumiem? A muszę też mieć informację jak nie znajdzie danej wartości z Listy 1 w Liście 2 (a są takie przypadki), żeby wtedy dodać wartość "Puste" w danym indexie listy 1 [j], jest to istotne w dalszej części kodu, jeżeli jakaś wartość jest nieodnaleziona.

AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2155
0

To znaczy, że musisz skorzystać z Insert() na liście, w którym podajesz wartość jaką chcesz dodać do listy oraz indeks, na którym ta wartość ma się znaleźć.

Kopiuj
 for (int j = 0; j < Lista1.Count; j++)
            {

                for (int i = 0; i < Lista2.Count-3; i++) //wyszukiwanie BPP kolejnych punktów
                {
                    if (Lista1[j] == Lista2[i])
                    {
                       Lista3.Insert(i + 3, Lista2[i + 3]);
                       break;
                    }
                    else
                    {
                        Lista3.Insert(i+3, "PUSTE");
                    }
                }
            }

Problemem jest ArgumentOutOfRangeException jeśli Lista3 jest pusta, albo jak spróbujesz dodać element do indeksu większego niż ilość elementów w liście. Wydaje mi się, że zamiast List<T> najlepiej będzie ci operować na tablicy string[] wtedy może zainicjować rozmiar tej tablicy i OutOfRange nie wystąpi. Jest jeszcze inna opcja.

Zrób kopie List1 i zmieniaj wartości w kopii jeśli nie ma powtórzeń.

Kopiuj
            List<string> lista1 = new List<string>()
            {
                "text",
                "extra",
                "super",
                "fajnie",
                "inny"
            };

            List<string> kopiaListy = lista1;

            for (int i = 0; i < lista1.Count; i++)
            {
                if (lista1[i] != "super")
                    kopiaListy[i] = "PUSTE";
            }

Oczywiście zrób sobie dwie pętle. Ogólny zamysł powinieneś zrozumieć.

REZULTAT
list_array.png

PS
Martwi mnie jeszcze kwestia tej pętli. Odejmujesz 3 Lista2.Count-3, później w indeksie dodajesz te 3 Lista2[i + 3]. Po co?

EB
  • Rejestracja:około 4 lata
  • Ostatnio:ponad rok
  • Postów:15
0

@AdamWox:
Co do "PS." Ech, mogłem to usunąć przed wstawieniem 😅
Generalnie to zdaje sobie sprawę że powinienem to robić na czymś innych niż listach, najlepiej pewnie sobie stworzyć klasę, ale na chwilę obecną jest to dla mnie prostsze i robię to tak.
Mam tak zrobione bo lista 2 składa się [Nr, X, Y, Cecha] i -3 jest żeby leciało po nr punktów. A +3 jest później bo do listy 3 cechę punktu z listy 2 na podstawie kolejności z listy 1 xD
Tylko może się właśnie zdarzyć że w liście 1 będzie jakiś punkt którego nie będzie w liście 2, i w tym wypadku własnie trzeba wstawić tą wartość "Puste".
Ale to z kopią listy mi się podoba, muszę to przetestować.
Generalnie zamysł aplikacji jest taki żeby jako efekt końcowy rysowało linie o różnych grubościach w DXF'ie. Lista 1 to punkty liń z DXF'a, Lista 2 to punkty z txt które posiadają określone cechy, tylko nie są poukładane liniami tylko w jakimś chaotycznym porządku. I żeby to narysować muszę przypisać liniom z DXF'a cechy punktów z txt. Po to jest właśnie lista 3. Zapewne robie to trochę na około ale na razie sobie postawiłem takie ambitne zadanie i z tym walczę po swojemu 😅
Coś w ten deseń:
screenshot-20210330101830.png

JP
  • Rejestracja:ponad 7 lat
  • Ostatnio:4 miesiące
  • Postów:1065
0

Prosta klasa z danymi i indeksem jako pole w klasie. Potem Intersect, Except i orderby.
Nie chce mi się rozpisywać z telefonu ale sprawdź te metody.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)