Avatar billede touel Nybegynder
21. marts 2005 - 15:12 Der er 26 kommentarer og
1 løsning

StringBuffer arrays

I følgende kode, hvis jeg støder på et tal, som er forskellig fra det forrige tal, ex. "95410, 55789", så skal 55 ned på en ny linie, og dens efterfølgende tal.
En anden lille ting. En modifikation i koden så den selv kan se efter om det er de første 2 tal den skal tage eller 3 tal.
ex. "95258,95147,95369,95123" //Her kunne resultat være : "95,258,147,369,123"
det andet ex.
"155987,155654,155321,155753" // Her kunne resultat være :"155,987,654,321,753"


if ((a[i] / 1000) != last)
            {
             
                sb.append(a[i] / 1000);
                sb.append(",");
                last = a[i] / 1000;
       
                if(i > 0)
                {
                    sb.append("\r\n");
                }
            }
            sb.append(a[i] % 1000 );
Avatar billede kalp Novice
21. marts 2005 - 16:19 #1
Ved det ikke er det du spørger efter hehe, men har da lavet det her just for the fun of it:))

package mypackage;

public class Class3
{
  public Class3()
  {
 
  int[] liste = new int[3];
  liste[0] = 33567;
  liste[1] = 33437;
  liste[2] = 33667;
  String resultat = "";
  String tal1 = "";
  String tal2 = "";
  String antal = "";
 
  for (int i = 0; i < liste.length; i++)
  {
    if(i < 1)
    {
    resultat = "" + liste[0] ;
    tal1 = "" + liste[i];
    tal2 = "" + liste[i+1];
    for (int b = 0; b < tal1.length(); b++)
    {
      if(tal1.charAt(b) != tal2.charAt(b))
      {
        break;
      }
      else
      antal += tal1.charAt(b);
    }
    }
    else if (i >= 2)
    {
      for (int c = 1; c < liste.length; c++)
      {
      tal1 = "" + liste[c];
        resultat += ",";
        for (int t = 0; t < tal1.length() - antal.length(); t++)
        {
          resultat += tal1.charAt(antal.length()+t);
        }
             
      }
     
    }
   
  }
  System.out.println(resultat);
 
 
  }

  /**
  *
  * @param args
  */
  public static void main(String[] args)
  {
    Class3 class3 = new Class3();
  }
}
Avatar billede kalp Novice
21. marts 2005 - 16:20 #2
Blev tilgengæld godt forvirret over hvad jeg lavede men det virkede da hihihi:) men meget forvirrende kode sikkert hehe

du kan copy & paste den direkte og køre den
Avatar billede touel Nybegynder
21. marts 2005 - 19:10 #3
Hvis det her kunne laves vha stringbuffer, ville det være bedre... kan man ud fra det jeg har skrevet foroven af eks, lave det således at det også kan tage i mod 3 tal ???
Avatar billede kalp Novice
21. marts 2005 - 19:13 #4
touel >> jeg er helt enig med dig i det vil være medre med stringbuffer.. har bare aldrig rørt den derfor jeg blev nød til at være "creativ" hehe:)

men måske kan jeg da hjælpe alligevel, men hvad mener du med at det skal tage imod 3 tal?

altså

157

3 tal på den måde?
Avatar billede touel Nybegynder
21. marts 2005 - 21:23 #5
si senor...jeg kan godt forstå dig, men jeg har set koder kun på et par linier vha stringbuffere lave det samme som din stykke kode. Det kunne jo være smart med en funktion, som scanner igennem nogle tal og kan se at hvis de alle starter med ex 155, så print 155 ud kun en gang, mens de andre tal printes ud efterfølgende.. så scanner den videre, opdager igen en talrække som  starter med 74, og printer 74 for sig selv og de resterende tal derefter....
Avatar billede kalp Novice
21. marts 2005 - 21:27 #6
Jeg kan måske godt hvis jeg tænker mig komme med et bedre bud hehe, men bliver stadig på et par linjer.. det undre mig over ingen af de andre GODE java programmere ikke har svaret her for de har da set spørgsmålet! og det burde ik være et problem for dem:)
Avatar billede snoop_one Nybegynder
22. marts 2005 - 11:28 #7
Måske kan du bruge det her til noget:

public static String format(String input, int length) {
        StringTokenizer st = new StringTokenizer(input, ",");
        StringBuffer sb = new StringBuffer();
        String current = new String();
        String next = st.nextToken();
        while (st.hasMoreTokens()) {
            current = next;
            next = st.nextToken();
            sb.append(current);
            if (current.regionMatches(0, next, 0, length)) {
                sb.append(",");
            } else{
                sb.append("\n");
            }
        }
        sb.append(next);
        return sb.toString();
    }

    public static void main(String... args) {
        String input = "55789,95258,95147,95369,95123,55893,56983,56897,56978";
        System.out.println(format(input,2));
        input = "55789,955258,955147,955369,955123,555893,516983,516897,561978";
        System.out.println("--------------------------------------------------");
        System.out.println(format(input,3));
    }

Ovenstående giver følgende output:
55789
95258,95147,95369,95123
55893
56983,56897,56978
--------------------------------------------------
55789
955258,955147,955369,955123
555893
516983,516897
561978
Avatar billede snoop_one Nybegynder
22. marts 2005 - 11:30 #8
er ikke lige klar over, at ovenstående kode er den nemmeste eller simpleste... men helt klart den hurtigste at implementere, efter min mening ;o)
Avatar billede snoop_one Nybegynder
22. marts 2005 - 11:34 #9
hovsa - skulle måske også lige pointere, at der mangler check for om den længde du gerne vil bruge (f.eks. 2 eller 3) er mindre end tal "størrelsen".
Avatar billede kalp Novice
22. marts 2005 - 11:35 #10
snoop_one >> hehe tjah jeg blev da også pænt forvirret i min egen kode hehe
Avatar billede touel Nybegynder
22. marts 2005 - 11:44 #11
tja drenge.. hva skal jeg sige.. der bliver hoppet rundt i både Strings, StringTokenizer og String arrays... meget forvirrende....jeg må ærlig tilstå at jeg har fået banket for megen af arne's string arrays i hovedet, og vil hellere hælde til sådan en løsning. Men for jeres indsats vil jeg gerne gi jer points...så må jeg finde et andet sted og poste og se om de kan hjælpe mig ud af det her....så begge 2 kast svar !
Avatar billede kalp Novice
22. marts 2005 - 11:48 #12
før du lukker kan du da lige prøve at hive fat i arne og se hvad han har af forslag:) han kan blot ignorere vores forslag:)
Avatar billede touel Nybegynder
22. marts 2005 - 11:52 #13
jeg tror jeg har brugt ham mere end rigeligt.... men han er velkommen til at svare...
Avatar billede snoop_one Nybegynder
22. marts 2005 - 11:56 #14
Hvad er det der er forvirrende? Strings er der fordi du har postet det som strenge i dine eksempler. Når man så har med strenge at gøre og vil dele dem op i f.eks. ord så benyttes en tokenizer.
Hvor kom string arrays ind i billedet henne?
Hvis du vil, kan jeg godt kommentere koden hvis det er der sko'en trykker - men det er op til dig...
Avatar billede touel Nybegynder
22. marts 2005 - 12:10 #15
snoop one << kan du lave dit kode eks om, så det i stedet for læser fra et int array ? Det vil være til stor hjælp
Avatar billede touel Nybegynder
22. marts 2005 - 12:13 #16
og kunne man automatisere processen med at se om det er 2 eller 3 tal som er ens og derefter skrive efterfølgende tal ud ???
Avatar billede touel Nybegynder
22. marts 2005 - 12:14 #17
jeg ved godt at jeg er meget krævende, men det er altså hvad jeg ska ha løst for at kunne komme videre med min opg :0)
Avatar billede snoop_one Nybegynder
22. marts 2005 - 12:19 #18
jep... men du får den hurtige version ;-)

public static void main(String... args) {
        int input[] = new int[]{55789,95258,95147,95369,95123,55893,56983,56897,56978};
        String strInput = new String();
        for(int i = 0 ; i < input.length-1; i ++){
            strInput += input[i]+",";
        }
        strInput += input[input.length-1];
        System.out.println(format(strInput,2));
        System.out.println("--------------------------------------------------");
    }

Giver som output:

55789
95258,95147,95369,95123
55893
56983,56897,56978
--------------------------------------------------
Avatar billede snoop_one Nybegynder
22. marts 2005 - 12:23 #19
hehe... nu skal jeg jo heller ikke lave din opgave for dig, det får du ikke meget gavn af...
Avatar billede touel Nybegynder
22. marts 2005 - 12:25 #20
Ok tak... jeg leger lige videre med din løsning... får jeg ingen problemer med det.. ber jeg om et svar i løbet af nogen tid....
Avatar billede snoop_one Nybegynder
22. marts 2005 - 12:28 #21
men hvad med dette eksempel:
1500,1501,1532,7850

vil det give:
1500,1501,1532
7850

eller:
1500,1501
1532
7850

eller:
1500
1501,1532
7850

eller noget helt andet?
Avatar billede touel Nybegynder
22. marts 2005 - 12:53 #22
Krydsforhøring hva.... hehe.. altså med dit eks, hvor den tjekker de første 2 tal, så vil den jo gi som output det første svar du skriver :
1500,1501,1532
7850

Der skal stadig laves modifikationer i eks, som jeg nu sidder med
Avatar billede touel Nybegynder
22. marts 2005 - 14:14 #23
Så har jeg fået koden til at virke efter hensigten... Kaster du et svar snoop one...

import java.util.StringTokenizer;

public class bimmer
{
   
    public static String format(String input, int length)
    {
        StringTokenizer st = new StringTokenizer(input, ",");
        StringBuffer sb = new StringBuffer();
        String current = new String();
        String next = st.nextToken();
        while (st.hasMoreTokens())
        {
            current = next;
            next = st.nextToken();
            sb.append(current);
                   
            /* (0) start af String next,(next) Strings navn,
            * (0) start af andet String,(length) længden på param 0 og 2.
            */
           
            if (current.regionMatches(0, next, 0, length))
            {
                sb.append(",");
            }
            else if (current.regionMatches(0,next,0,3))
            {
                sb.append (",");
            }
            else
            {
                sb.append ("\n");
            }
        }
      // sb.append(next);
        return sb.toString();
    }
               
                     
           
               

    public static void main(String [] args)
    {
            int input[] = {55789,55893,95258,95147,95369,95123,56983,56897,
                            55123,55124,55126,55189,56978};
        String strInput = new String();
        for(int i = 0 ; i < input.length; i ++)
        {
            strInput += input[i]+",";
        }
        strInput += input[input.length-1];
        System.out.println(format(strInput,2));
   
    }

             
}

SVAR :
55789,55893
95258,95147,95369,95123
56983,56897
55123,55124,55126,55189
56978
Avatar billede snoop_one Nybegynder
22. marts 2005 - 17:39 #24
så gerne - det vigtigste er jo, at du har fået noget ud af det ;-)
Avatar billede arne_v Ekspert
22. marts 2005 - 23:27 #25
for en god ordens skyld : så kom jeg faktisk med nogle tanker i den foregående tråd

http://www.eksperten.dk/spm/602093
Avatar billede snoop_one Nybegynder
23. marts 2005 - 00:29 #26
Jep så den godt, var også en god løsning... men sådan som jeg forstod det på touels post, citat: "... første 2 tal den skal tage..." det forstår jeg som de 2 første cifre i tallet...
dvs. at i dit eksempel så vil følgende tal:
5500,5520,55023,11052

give:
5500,5520
55023
11052

hvor i det ovenstående vil outputtet være:
5500,5520,55023
11052

men om, at jeg har forstået hvad der egentlig var ment med dette spg ved jeg faktisk ikke :-)
Avatar billede arne_v Ekspert
25. marts 2005 - 14:43 #27
Umiddelbart synes jeg at resten+3 cifre virke rmere logisk end 2+resten cifre, men
man ved aldrig.

Det er iøvrigt nemt at rette min kode til så den bruger det andet princip.

Eksempel:

package march;

public class TryAgain {
    public static String arr2strLast3(int[] a) {
        StringBuffer sb = new StringBuffer("");
        int last = -1;
        for (int i = 0; i < a.length; i++) {
            if (i > 0) {
                sb.append(",");
            }
            if ((a[i] / 1000) != last) {
                if(i > 0) {
                    sb.append("\r\n");
                }
                sb.append(a[i] / 1000);
                sb.append(",");
                last = a[i] / 1000;
            }
            sb.append(a[i] % 1000);
        }
        return sb.toString();
    }

    public static String arr2strFirst2(int[] a) {
        StringBuffer sb = new StringBuffer("");
        int last = -1;
        for (int i = 0; i < a.length; i++) {
            if (i > 0) {
                sb.append(",");
            }
            int n = 10;
            while(a[i] / n >= 100) n *= 10;
            if ((a[i] / n) != last) {
                if(i > 0) {
                    sb.append("\r\n");
                }
                sb.append(a[i] / n);
                sb.append(",");
                last = a[i] / n;
            }
            sb.append(a[i] % n);
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        int[] ia = { 5500, 5520, 55023, 11052 };
        System.out.println(arr2strLast3(ia));
        System.out.println(arr2strFirst2(ia));
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester