Zapsání dlouhého čísla do pole po jednotlivých číslech   otázka

VB.NET, Algoritmy

Dobrý den.

Nevím jeslti je to z Téma pochopitelné.

Snažím se dostat číslo (např. 901806180300) do pole, ale aby v každé buňce bylo jen jedno číslo.

Potřebuji dostat toto.

P(9,0,1,8,0,6,1,8,0,3,0,0)

Případně P(90, 18, 06, 18, 300)

Zatím se mi to povedlo použe převedením čísla na string a postupným načítáním. Je toto řešení správné, nebo existuje jednodušší cesta?

Děkuji za radu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdá se mi to jako korektní postup. Když mi napíšete jakého typu je cílové pole a k čemu má tato funkčnost sloužit, tak by se možná dalo vymyslet něco lepšího.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Na vstupu mam textový soubor na každém řádku je jedno dlouhé číslo.

V ukázce je výtažek z částí kódu...

        Dim lines As String() = IO.File.ReadAllLines(file)

              dim line as string = lines(N)


                p(0) = CInt(line(0) & line(1))
                p(1) = CInt(line(2) & line(3))
                p(2) = CInt(line(4) & line(5))
                p(3) = CInt(line(6) & line(7))
                p(4) = CInt(line(8) & line(9))

            Next
'test
            MsgBox(p(0) & "+" & p(1) & "+" & p(2) & "+" & p(3) & "+" & p(4))
        Next


Vyhodnotím a načtu další číslo a P() přepíšu.

Potřebuju, aby se to převádělo co nejefektivnějš.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak s tím ReadAllLines bych byl opatrný. Co když bude soubor binární, nebo příliš velký pro načtení do paměti? Rovněž převedení Stringu vytvořeného ze dvou Charů na Integer nepovažuji za bezpečné nehledě na to, když počet znaků na řádku nebude zrovna 10...

Jestliže ale máte 100% jistotu že formát souboru bude vždy takový jako očekáváte tak budiž.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Počet znaků bude vždy stejný.

Pokusím se nějak zaměřit na vaše připomínky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jak prosím načtu jen určený řádek z textového souboru?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

IO.StreamReader má metodu ReadLine, ta čte sekvenčně řádek po řádku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Jen tak v rychlosti: (určitě existuje rychlejší způsob, ale nemám čas moc přemýšlet)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim Hodnoty As String
        Hodnoty = "12345678901234"
        Dim Vysledek As Collection = Pole(Hodnoty, 2)

        For i As Int32 = 1 To Vysledek.Count

            MsgBox(Vysledek(i))

        Next
        End
    End Sub
    Private Function Pole(ByVal Hodnoty As String, ByVal PocetCislicProOddeleni As Byte) As Collection
        Dim Vysledne_Pol As New Collection
        If Hodnoty.Length Mod PocetCislicProOddeleni > 0 Then
            MsgBox("Chyba pole nelze rozdělit na přesný počet stejně velkých bloků")
            Return Nothing

            Exit Function
        End If

        For i As Int32 = 0 To (Hodnoty.Length / PocetCislicProOddeleni) - 1
            Vysledne_Pol.Add(Hodnoty.Substring(i * PocetCislicProOddeleni, PocetCislicProOddeleni))
        Next



        Return Vysledne_Pol


    End Function

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak můžu vás ubezpečit, že vámi uvedený kód bude nesrovnatelně pomalejší než kód uváděný tazatelem. Mimochodem nechápu, proč máte za výrazem Return Nothing ještě Exit Function...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je to jen alternativa k tomu co už bylo. Třeba to někomu někdy pomůže v něčem jiném :) Co se týká Exit function je to můj pozůstatek z vb6. Tyto pozůstatky se mě drží zuby nechty :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přiznám se, že tak trochu nechápu konzistenci Vašeho dotazu (porovnám-li příspěvek níže).

Ani netuším, jak si vyložit Váš dotaz, že potřebujete dostat P(9,0,1,8,0,6,1,8,0,3,0,0)

Případně P(90, 18, 06, 18, 300)

Jedná se o pole, které v jednotlivých prvcích obsahuje jednotlivé číslice? (pak ale nevím, jak si vyložit ten druhý řádek, kdy máte v jednotlivých prvcích 2, resp. 3 číslice).

Proto se předem omlouvám, budu-li odpovídat na něco jiného, ale vycházím ve své odpovědi z Vaší poslední věty:Zatím se mi to povedlo použe převedením čísla na string a postupným načítáním. Je toto řešení správné, nebo existuje jednodušší cesta?

Jestli tedy máte někde dlouhé číslo (jako posloupnost jednotlivých číslic) a chcete je vložit do pole tak, aby každý prvek pole ukazoval na právě jednu číslici, pak vězte, že můžete použít jednoduché:

Dim moje_pole_cisel as String
moje_pole_cisel = "901806180300" ' nebo to načtete přímo příkazem "ReadLine z Vašeho souboru - z toho Vám automaticky vypadne text

' no a to je vše

'zadáte-li totiž
msgBox(moje_pole_cisel(3))
' pak Vám to vypíše číslo na pozici 3, tedy osmičku (zkrátka chová se to jako pole znaků)

nevím, jestli Vám to je k něčemu, protože sice ty "stringy" můžete za sebe naskládat v libovolném množství (a obdržet tak libovolně dlouhé "číslo" (spíše zápis čísla), ale je nutné vést v patrnosti, že je to uloženo jako text (nebo pole znaků, jak chcete). Tzn. budete-li s tím chtít dále pracovat i jinak než pouze vytisknout, budete si muset jednotlivé znaky při případných výpočtech přetypovávat na Int.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback