» »

[Java] Podatkovni tip

[Java] Podatkovni tip

piki12 ::

Pozdravljeni,
zanima me kateri tip naj uprabim da združim String, int string int int float, poskusil sem v ArrayListu in HashMapu pa nič. :(
Pa zakaj morma pisat recimo v
ArrayList<Intiger>
in ne int, kakšna razlika ;( Hmm

lp,
piki12

kr?en ::

Wat?

Ce bi rad zdruzeval razne objekte v nek string (npr. hoces potem zadevo izpisat na zaslon), poglej StringBuilder. Samo moras vedet, da ce bos appendal kaksne objekte, moralo le-ti imeti overrideano toString() metodo.

V sezname lahko shranjujes samo objekte (Integer) in ne primitive (int).

Zgodovina sprememb…

  • spremenil: kr?en ()

Trinitron ::

int, float,... so primitivni tipi, Integer, String, ... pa so "kompleksni" tipi. Dejanska razlika je v tem, da je npr. Integer implementiran kot objekt in ima zato na voljo nekaj metod, ki jih lahko kličeš nad instancami tega objekta.

Torej, za tvoje potrebe bi bilo najlažje, da si spišeš svoj objekt, v katerem boš hranil želene vrednosti. Da pa boš znal to naredit, pa predlagam, da se najprej spoznaš z osnovami objektnega programiranja.

Zgodovina sprememb…

piki12 ::

Trinitron sploh na to nisem pomislil da bi sovoj objekt napisal, kar silil sem notri v arraye :D

kr?en hvala sicer za idejo ampak ne lub se mi skos parasat bom raje uprabil tako kot mi je svetoval tri objekt in not našopal :) Odlična ideja.

Hvala za nasvet.

kr?en ::

Itak ti ne preostane drugega kot narest svoj objekt.

Pa poglej si se malo osnove objektnega programiranja.

roba87 ::

Torej združit hočeš stringe ? Zakaj preprosto ne uporabiš StringBuilder razred ?
stringBuilder.append("string1"); stringBuilder.append("string2");...


Aha, ti je že kr?en svetoval... nisem vsega prebral :)

Zgodovina sprememb…

  • spremenil: roba87 ()

Pebkac ::

Brez problema lahko daješ npr. v ArrayList objekte poljubnih tipov, za primer tole deluje brez problemov:
import java.util.ArrayList;

public class test {
	public static void main(String[] args) {
		ArrayList al = new ArrayList();
		Integer i = 3;
		String s = "sdfasdfasd";
		Float f = 32234.655f;
		Double d = 333.553243490543;
		al.add(i);
		al.add(f);
		al.add(d);
		al.add(s);
		for (Object element : al){
			System.out.println(element);
		}
	}
}


Pač ustvariš splošen ArrayList in mu ne določiš tipa vsebovanih elementov. Na ta način bodo vsi elementi ArrayLista tipa Object oziroma kateregakoli podrazreda (katerikoli objekt). Ne more pa ArrayList vsebovati primitivnih tipov, kot so int, float,...
Zato obstajajo objektni tipi Integer, Float, Double,... ki ti primitivni tip "ovijejo", da ga lahko uporabljaš kot objekt. Sicer pa lahko te tipe uporabljaš enako kot primitivne tipe, saj ti java avtomatsko poskrbi za pretvorbo, ko je to potrebno.

piki12 ::

Potem pa pri naslednji nalogi imam pa težavico pri komparatarju urediti bi moral po floatu, pa ne vem zakaj mi noče uredit. Komparator sem našel stacku :/


public class tecaj {
   
    public static void main(String[] argv) throws FileNotFoundException{
        TreeMap<Integer,Float> splosno =new TreeMap();


       Scanner sc = new Scanner(new File("CHF2011.txt"));
       
       while(sc.hasNextLine()){
         String[] a= sc.nextLine().split(" ");
         splosno.put(Integer.parseInt(a[0].trim()), Float.parseFloat(a[1].replace(",", ".")));
         
           
       }
     
     for(Integer k : splosno.keySet()) {
      System.out.printf("%s = %f\n", k, splosno.get(k));
    }
    }
  
    
    
    class ValueComparator implements Comparator<String> {

    Map<String, Float> base;
    public ValueComparator(Map<String, Float> base) {
        this.base = base;
    }

    // Note: this comparator imposes orderings that are inconsistent with equals.    
    public int compare(String a, String b) {
        if (base.get(a) >= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
    
    }
}

kr?en ::

#1 Komparator je narejen za string.
#2 Ti samo definiras implementacijo Comparator vmesnika, uprabis ga pa nikjer. Poglej si Collections utility razred. Predvsem sort() metodo. Zal ta metoda dela samo za sezname in ne za mape. Ce hoces sortiran Map, moras uporabljat SortedMap, kjer kljuci implementirajo vmesnik Comparable.

FYI: http://docs.oracle.com/javase/6/docs/ -> use it

Zgodovina sprememb…

  • spremenil: kr?en ()

piki12 ::

ja sej lih to sem hotel dodat da Collections sort ne dela tukaj z tem znam in naredim
Collections.sort(sort,new Comparator<Objekt>(){}); 

Sej sem uprabljal sortedMAP oz treemap, sortedmep je abstrakti razred

kr?en ::

Tak Map je ze sortiran in ne potrebujes nobenega komparatorja. Daj preberi si dokumentacijo TreeMap-a in metode, ki jih podpira.

piki12 ::

Ja ni sortiran 20000%. Dobim takle izpis.Sem bral na prosojnicah ja da bi moral biti sortiran ;/ hmm pa ni . Izpisat moram največji in najmanjši tečaj, vendar sem za vsak slučaj naredil izpis celotni, pa ga ni notri 100%


run:
20110101 = 1,274700
20110102 = 1,274700
20110103 = 1,256100
20110104 = 1,263400
20110105 = 1,273700
20110106 = 1,283200
20110107 = 1,267300
20110108 = 1,272700
20110109 = 1,272700
20110110 = 1,257700
20110111 = 1,266100
20110112 = 1,278500
20110113 = 1,282700
20110114 = 1,298500
20110115 = 1,312700
20110116 = 1,312700
20110117 = 1,299000
20110118 = 1,292800
20110119 = 1,304400
20110120 = 1,300200
20110121 = 1,317500
20110122 = 1,327200
20110123 = 1,327200
20110124 = 1,317100
20110125 = 1,307400
20110126 = 1,302400
20110127 = 1,306700
20110128 = 1,308800
20110129 = 1,318100
20110130 = 1,318100
20110131 = 1,294300
20110201 = 1,306500
20110202 = 1,305600
20110203 = 1,310700
20110204 = 1,304900
20110205 = 1,315900
20110206 = 1,315900
20110207 = 1,311100
20110208 = 1,321800
20110209 = 1,327400
20110210 = 1,327100
20110211 = 1,327300
20110212 = 1,339900
20110213 = 1,339900
20110214 = 1,331300
20110215 = 1,322600
20110216 = 1,312700
20110217 = 1,314100
20110218 = 1,305900
20110219 = 1,314200
20110220 = 1,314200
20110221 = 1,306800
20110222 = 1,300000
20110223 = 1,297100
20110224 = 1,291800
20110225 = 1,292100
20110226 = 1,303000
20110227 = 1,303000
20110228 = 1,288200
20110301 = 1,299100
20110302 = 1,289100
20110303 = 1,296600
20110304 = 1,313900
20110305 = 1,321400
20110306 = 1,321400
20110307 = 1,305600
20110308 = 1,309300
20110309 = 1,313200
20110310 = 1,306000
20110311 = 1,301300
20110312 = 1,309100
20110313 = 1,309100
20110314 = 1,307100
20110315 = 1,300600
20110316 = 1,294800
20110317 = 1,270500
20110318 = 1,284200
20110319 = 1,297500
20110320 = 1,297500
20110321 = 1,294900
20110322 = 1,296600
20110323 = 1,293100
20110324 = 1,293500
20110325 = 1,300500
20110326 = 1,316300
20110327 = 1,316300
20110328 = 1,308600
20110329 = 1,303800
20110330 = 1,313400
20110331 = 1,310800
20110401 = 1,317500
20110402 = 1,329900
20110403 = 1,329900
20110404 = 1,327900
20110405 = 1,323800
20110406 = 1,333600
20110407 = 1,326000
20110408 = 1,323800
20110409 = 1,339700
20110410 = 1,339700
20110411 = 1,326300
20110412 = 1,315300
20110413 = 1,313600
20110414 = 1,308100
20110415 = 1,305400
20110416 = 1,313600
20110417 = 1,313600
20110418 = 1,298000
20110419 = 1,287700
20110420 = 1,305000
20110421 = 1,307100
20110422 = 1,304500
20110423 = 1,311800
20110424 = 1,311800
20110425 = 1,311800
20110426 = 1,296400
20110427 = 1,304400
20110428 = 1,306500
20110429 = 1,307400
20110430 = 1,309700
20110501 = 1,309700
20110502 = 1,309700
20110503 = 1,294300
20110504 = 1,290800
20110505 = 1,290800
20110506 = 1,278900
20110507 = 1,289800
20110508 = 1,289800
20110509 = 1,272900
20110510 = 1,263900
20110511 = 1,277900
20110512 = 1,273000
20110513 = 1,271400
20110514 = 1,287700
20110515 = 1,287700
20110516 = 1,269800
20110517 = 1,265600
20110518 = 1,267800
20110519 = 1,267700
20110520 = 1,275800
20110521 = 1,281300
20110522 = 1,281300
20110523 = 1,249100
20110524 = 1,258700
20110525 = 1,246900
20110526 = 1,243700
20110527 = 1,232800
20110528 = 1,240900
20110529 = 1,240900
20110530 = 1,227900
20110531 = 1,235500
20110601 = 1,242800
20110602 = 1,222600
20110603 = 1,234000
20110604 = 1,241200
20110605 = 1,241200
20110606 = 1,234300
20110607 = 1,231800
20110608 = 1,240100
20110609 = 1,234600
20110610 = 1,229900
20110611 = 1,240000
20110612 = 1,240000
20110613 = 1,224600
20110614 = 1,218400
20110615 = 1,236500
20110616 = 1,217100
20110617 = 1,214900
20110618 = 1,232100
20110619 = 1,232100
20110620 = 1,221900
20110621 = 1,221300
20110622 = 1,222900
20110623 = 1,216200
20110624 = 1,207000
20110625 = 1,209400
20110626 = 1,209400
20110627 = 1,194500
20110628 = 1,205200
20110629 = 1,205400
20110630 = 1,217100
20110701 = 1,233800
20110702 = 1,247900
20110703 = 1,247900
20110704 = 1,242800
20110705 = 1,241000
20110706 = 1,226200
20110707 = 1,213700
20110708 = 1,223200
20110709 = 1,233300
20110710 = 1,233300
20110711 = 1,200400
20110712 = 1,180200
20110713 = 1,174900
20110714 = 1,165100
20110715 = 1,166300
20110716 = 1,175100
20110717 = 1,175100
20110718 = 1,155100
20110719 = 1,165400
20110720 = 1,177200
20110721 = 1,184100
20110722 = 1,188500
20110723 = 1,202700
20110724 = 1,202700
20110725 = 1,180300
20110726 = 1,171400
20110727 = 1,175600
20110728 = 1,162500
20110729 = 1,158700
20110730 = 1,160900
20110731 = 1,160900
20110801 = 1,154000
20110802 = 1,124200
20110803 = 1,099900
20110804 = 1,121400
20110805 = 1,095800
20110806 = 1,105900
20110807 = 1,105900
20110808 = 1,097400
20110809 = 1,080700
20110810 = 1,049500
20110811 = 1,045400
20110812 = 1,089300
20110813 = 1,118700
20110814 = 1,118700
20110815 = 1,118700
20110816 = 1,139100
20110817 = 1,156200
20110818 = 1,149800
20110819 = 1,147800
20110820 = 1,154800
20110821 = 1,154800
20110822 = 1,138300
20110823 = 1,143900
20110824 = 1,155300
20110825 = 1,156800
20110826 = 1,152800
20110827 = 1,167000
20110828 = 1,167000
20110829 = 1,185400
20110830 = 1,199300
20110831 = 1,192100
20110901 = 1,165800
20110902 = 1,142300
20110903 = 1,132000
20110904 = 1,132000
20110905 = 1,127600
20110906 = 1,220000
20110907 = 1,215800
20110908 = 1,219900
20110909 = 1,224800
20110910 = 1,235900
20110911 = 1,235900
20110912 = 1,216900
20110913 = 1,215900
20110914 = 1,215200
20110915 = 1,217700
20110916 = 1,219600
20110917 = 1,227700
20110918 = 1,227700
20110919 = 1,217600
20110920 = 1,218400
20110921 = 1,236300
20110922 = 1,233300
20110923 = 1,236200
20110924 = 1,242300
20110925 = 1,242300
20110926 = 1,232900
20110927 = 1,233700
20110928 = 1,231300
20110929 = 1,231700
20110930 = 1,231100
20111001 = 1,239100
20111002 = 1,239100
20111003 = 1,226700
20111004 = 1,226300
20111005 = 1,238600
20111006 = 1,244200
20111007 = 1,248400
20111008 = 1,258300
20111009 = 1,258300
20111010 = 1,254300
20111011 = 1,245200
20111012 = 1,251200
20111013 = 1,248900
20111014 = 1,249600
20111015 = 1,260100
20111016 = 1,260100
20111017 = 1,250600
20111018 = 1,247100
20111019 = 1,249300
20111020 = 1,256200
20111021 = 1,237300
20111022 = 1,248400
20111023 = 1,248400
20111024 = 1,239100
20111025 = 1,236600
20111026 = 1,234800
20111027 = 1,239000
20111028 = 1,233000
20111029 = 1,244500
20111030 = 1,244500
20111031 = 1,244500
20111101 = 1,244500
20111102 = 1,227600
20111103 = 1,225600
20111104 = 1,226700
20111105 = 1,243800
20111106 = 1,243800
20111107 = 1,242100
20111108 = 1,255200
20111109 = 1,250900
20111110 = 1,247400
20111111 = 1,244800
20111112 = 1,257900
20111113 = 1,257900
20111114 = 1,249100
20111115 = 1,251400
20111116 = 1,249400
20111117 = 1,252900
20111118 = 1,251500
20111119 = 1,258900
20111120 = 1,258900
20111121 = 1,250900
20111122 = 1,248300
20111123 = 1,243300
20111124 = 1,239800
20111125 = 1,239400
20111126 = 1,247200
20111127 = 1,247200
20111128 = 1,246100
20111129 = 1,241300
20111130 = 1,239000
20111201 = 1,242100
20111202 = 1,246400
20111203 = 1,257100
20111204 = 1,257100
20111205 = 1,248500
20111206 = 1,247000
20111207 = 1,253800
20111208 = 1,251500
20111209 = 1,246500
20111210 = 1,256200
20111211 = 1,256200
20111212 = 1,249700
20111213 = 1,248400
20111214 = 1,244300
20111215 = 1,250800
20111216 = 1,235000
20111217 = 1,246100
20111218 = 1,246100
20111219 = 1,230500
20111220 = 1,231100
20111221 = 1,230300
20111222 = 1,233400
20111223 = 1,234000
20111224 = 1,245200
20111225 = 1,245200
20111226 = 1,245200
20111227 = 1,235400
20111228 = 1,232200
20111229 = 1,230300
20111230 = 1,229700
20111231 = 1,238800

Zgodovina sprememb…

  • spremenilo: piki12 ()

Terman ::

Uf, kje začet.
1) Ti im aš komparator samo napisan, nikjer pa ga ne dejansko uporabiš.
2) Tvoj komparator dela s Stringi, ti pa imaš v mapi Integer in Float - dobil boš class cast exception, ali pa leksigrafsko sortiranje. Oboje seveda ni OK
3) Če prav razumem tvojo kodo, hočeš sortirati mapo po vrednostih, ne pa po ključih. Uporabiti moraš sorted map, ki mu že ob kreiranju podaš comparator.
4) V komparatorju ni potrebe po "požiranju" ključev. Če sta vrednosti enaki, naredi return key1.compareTo(key2)

piki12 ::

Sedaj sem napisal in deluje, zanima me ali obstaja kakšen lažji način :)) Predvsem zanima me komparator in telovadanje z 2 različnimi mapi :) .

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;



public class Testing {

    public static void main(String[] args) throws FileNotFoundException {

        HashMap<String,Double> map = new HashMap<String,Double>();
        ValueComparato bvc =  new ValueComparato(map);
        TreeMap<String,Double> sorted_map = new TreeMap<String,Double>(bvc);

       Scanner sc = new Scanner(new File("CHF2011.txt"));
        
       while(sc.hasNextLine()){
         String[] a= sc.nextLine().split(" ");
         map.put(a[0].trim(), Double.parseDouble(a[1].replace(",", ".")));
          
            
       }
        System.out.println("unsorted map: "+map);

        sorted_map.putAll(map);

        System.out.println("results: "+sorted_map);
    }
}

class ValueComparato implements Comparator<String> {

    Map<String, Double> base;
    public ValueComparato(Map<String, Double> base) {
        this.base = base;
    }

    // Note: this comparator imposes orderings that are inconsistent with equals.    
    public int compare(String a, String b) {
        if (base.get(a) >= base.get(b)) {
            return -1;
        } else {
            return 1;
        } // returning 0 would merge keys
    }
}

Zgodovina sprememb…

  • spremenilo: piki12 ()

Terman ::

Zakaj podatkov ne vneseš kar direktno v sorted_map mapo?

piki12 ::

Ja ne da se vsaj mislim ;/ Gledal primer na netu hmm..
http://stackoverflow.com/questions/1093...

Oz kako se bi tole naredil če imaš idejo terman

Zgodovina sprememb…

  • spremenilo: piki12 ()

Spura ::

Pebkac je izjavil:


Pač ustvariš splošen ArrayList in mu ne določiš tipa vsebovanih elementov.
Ne tega delat. A nisi vidu compiler warninga. Ce rabis tak List, potem naredi ArrayList<Object>.


piki12 je izjavil:

Ja ni sortiran 20000%. Dobim takle izpis.Sem bral na prosojnicah ja da bi moral biti sortiran ;/ hmm pa ni . Izpisat moram največji in najmanjši tečaj, vendar sem za vsak slučaj naredil izpis celotni, pa ga ni notri 100%


run:
20110101 = 1,274700
20110102 = 1,274700
20110103 = 1,256100
20110104 = 1,263400

Tole je cisto lepo sortirano in sicer po kljucu.

Terman je izjavil:

Zakaj podatkov ne vneseš kar direktno v sorted_map mapo?
Ker potem bo sortirano po kljucu ne pa po vrednosti. Kar je on naredil je hack, ki lahko gre zelo hitro narobe.

piki12 je izjavil:

Ja ne da se vsaj mislim ;/ Gledal primer na netu hmm..
http://stackoverflow.com/questions/1093...

Oz kako se bi tole naredil če imaš idejo terman


Ti si malo prehitro zasel v prevec globoke vode, in zdej z neta kopiras kodo, ki je ne razumes. Ce rabis samo najmanjso in najvecjo vrednost ne rabis vseh sortirat. Tudi ce bi hotel sortirat, ti ni treba tega z Map delat, ampak preprosto naredis List objektov, ki ti predstavljajo en tecaj in sortiras to, oziroma lahko kar listo Object arrayev, kar je sicer grdo in nepriporocljivo.

piki12 ::

Sedaj sem spisal novo verzijo ki deluje. Zakaj pa naj nebi bilo tisto vredu pa o kakem hacku govoriš. Jas vem da deluje če mi prav izpiše :D Čeporv tole kar ste mi povedali z svojim tipom je res res praktično in simple.

Moja koda:


import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Matej
 */

class menjalnitecaj{
   private String id;
   private float stevilo;

    public menjalnitecaj(String id, float stevilo) {
        this.id = id;
        this.stevilo = stevilo;
    }

    public String getId() {
        return id;
    }

    public double getStevilo() {
        return stevilo;
    }
    

}
public class Tecaj12 {
   public static void main(String args[]) throws FileNotFoundException{
       Scanner sc = new Scanner(new File("tecaj.txt"));
       ArrayList<menjalnitecaj> a=new ArrayList<>();
       while(sc.hasNext()){
          String[] b=sc.nextLine().split(" ");
          a.add(new menjalnitecaj(b[0].trim(),Float.parseFloat(b[1].replace(",", ".").trim())));
          
       
       
       }
       
       Collections.sort(a,new Comparator<menjalnitecaj>(){
       
           @Override
           public int compare(menjalnitecaj t, menjalnitecaj t1) {
             if(t.getStevilo()-t1.getStevilo()>=0)
                 return 1;
             else
                  return -1;
           }
              
           
       });
       
       System.out.print(a.get(0).getStevilo()+"\n");
       System.out.print(a.get(a.size()-1).getStevilo()+"");       
               
   
   
   }
    
}

kr?en ::

FFS, daj pisi imena klasov z veliko ;((

Pa daj vsaj povej kaj hoces narest in kaj tista datoteka (tecaj.txt) vsebuje oz. zgleda, ker tole je en navaden clusterfuck.

Pa komparator imas pomankljivo spisan. Kaj se zgodi, ce imata t in t1 isto vrednost?

Zgodovina sprememb…

  • spremenil: kr?en ()

piki12 ::

Ti bom kr koperu z prosojnice z programeranje 2:

Napiši program, ki prebere tekstovno datoteko
CHF2011.txt, v kateri so zbrani podatki o tečaju
švicarskega franka za leto 2011 in izpiše datum najvišjega
in najnižjega tečaja.
Z tuki je tole :)
https://ucilnica.fri.uni-lj.si/pluginfi...

piki12 ::

CHIF2011.txt predstavlja oz je datoteka tecaj.txt. Ja kako pa posebi primerjam če sta t1 in t2 enaki.?

kr?en ::

t1 > t2 -> 1
t1 = t2 -> 0
t1 < t2 -> -1

To vracas.

Spura ::

piki12 je izjavil:

Sedaj sem spisal novo verzijo ki deluje. Zakaj pa naj nebi bilo tisto vredu pa o kakem hacku govoriš. Jas vem da deluje če mi prav izpiše :D

Da, toda dvomim da razumes kako deluje in kaj gre vse lahko narobe. Sicer je pa med odgovori na stack overflowu tole:

Louis Wasserman (yes, one of the Google Guava guys), actually dislikes this answer quite a bit: "It breaks in several really confusing ways if you even look at it funny. If the backing map changes, it will break. If multiple keys map to the same value, it will break. If you call get on a key that isn't in the backing map, it will break. If you do anything whatsoever that would cause a lookup to happen on a key that isn't in the map -- a Map.equals call, containsKey, anything -- it will break with really weird stack traces."

piki12 ::

Ja ok potem rečmo to je narobe, kako pa nardit da bo delal prov ;/ hmm pa še z mapom :D


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Naloga iz Putka - UPM

Oddelek: Programiranje
242057 (1393) NejcSSD
»

[Java] Sortiranje razredov

Oddelek: Programiranje
101350 (1097) Spura
»

Sortiranje po večih atributih, java

Oddelek: Programiranje
161538 (1304) marjan_h
»

[JAVA] zaustavitev niti (threadov)

Oddelek: Programiranje
223049 (3049) morbo
»

[java] funkcija ekvivalentna print_r v PHP

Oddelek: Programiranje
161586 (1349) sverde21

Več podobnih tem