Permalänk

Vad är vad i Java?

Sitter och kliar mig i huvet och försöker få en klar bild över vad som är vad i Java programmering. Har hållit på en vecka ungefär men grejor som:

Objekt
Egenskaper
Metod (huvud, kropp)
Konstruktor osv.

Vad är vad i koden och vad är dess engelska namn? I koden nedan har jag kommenterat men vet inte alls om det stämmer som jag skrivit, om jag helt är ute och cyklar. Om nån snäll människa bara kan ta den koden jag klistrar in här och ta bort min kommentarer och bara skriva vad som är vad, skulle vara trevligt.

// Göra om det kilometer värdet som användaren matar in till miles // Import av Scanner classen för att kunna ta input från tangentbord och tilldela // en variabel i programmet dess värde import java.util.Scanner; // Import av DecimalFormat klassen för att formatera värdet till kontrollerat decimal format import java.text.DecimalFormat; // Skapar en klass vid namn Uppgift2 public class Uppgift2 { // Main metoden startar igång Java programmet public static void main(String[] args) { // Skapar ett Scanner objekt med variabeln input Scanner input = new Scanner(System.in); // Prompt för att användaren ska mata in km System.out.print("Mata in antal kilometer: "); // Skapa variabeln km av typen float för att sätta in input från nästa float tal som matas in float km = input.nextFloat(); // Skapar variabeln decFor för att bestämma formateringen på decimalerna DecimalFormat decFor = new DecimalFormat("0.00"); // Skapa variabeln miles samt gör beräkningen av km till miles double miles = km * 0.6214; // Visa text med info om beräknat värde i rätt decimalformat. Användning av den decimal format // variabel vi gjorde tidigare samt användning av dess metod format. System.out.print( ("Omvandlat blir detta: ") + decFor.format(miles) + (" miles \n")); } }

Permalänk
Medlem

All text du har skrivt är korrekt så det finns inte speciellt mycket att tillägga. Kanske peteteser som att din Scanner har namnet input och inte variabeln input, och samma sak med decFor.
Du behöver inte heller ha en hel double för att lagra dina miles utan det räcker även där med en float. Double har dubbelt så många värdesiffror jämfört med float och tar således upp dubbelt så mycket plats i minnet (i java 32 bitar mot 64 bitar). Då du antagligen inte lär få fler än 9 värdesiffror så räcker en float.

Annars stämmer som sagt allt du skrivt om medoterna, klasserna o.s.v. så det är fina fisken

Edit.
Mer att läsa för att det är kul att dela kunskap!
Värt att veta kan ju vara att nästan allt du använder i java ligger i metoder och klasser. T.ex. när du skapar din scanner anropar du standardklassen och Scanner(String Source); som tar en källa som inparameter. Du använder systemets tangentbord som källa så därför skriver du System.in som källa.
Sedan anropar du metoden .nextFloat() i din scanner som då väntar på nästa float i i din inkälla (System.in), och returnerar sedan det som skrivits in. Vill du ersätta Scannermetoden med din egen är det bara att du gör en egen metod med samma namn i ditt program. Alltså lägger till något som liknar

public class Scanner { public Scanner(String insource){ //Detta är en konstruktor. Den har samma namn som klassen, och returnerar inget värde men kan göra nödvändiga saker för hur programmet funkar System.out.print(insource ++ " is your insource"); //Här skulle riktiga scanner metoden startar och kontrollerat din källa och initialiserat den } public float nextFloat(){ /*Detta är en metod. Public innebär att andra klasser kan anropa den. float är vad för något den returnerar, nextFloat är namnet och den tomma parantesen innebär att den inte har någon input. Så när du skriver input.nextFloat(); anropas nextFloat metoden i klassen med namn input. */ return 42; //Här skuller riktiga scanner metoden gått in i någon loop som väntar på att få in din float och returnerat den instället för 42. } }

i en egen fil som du döper till Scanner.java

Mer om alla standardmetoder går att läsa på Oracles hemsida
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanne...

Visa signatur

In the end what separates a man from a slave?
Money? Power? No... A man chooses, a slave obeys.
ASUS Z170M-PLUS || Intel Core i7 6700k @ 4,7GHz || 64GB 2133MHz Corsair RAM || MSI NVIDIA RTX 2070 Gaming Z 8GB || Bifenix Prodigy M || 2x CZ TR150 480GB RAID 0 || BeQuiet DarkRock Pro

Permalänk

Okej så jag är inte helt borta med mina tankar då, känns ju skönt tack för hjälpen!

Om man tittar i min kod och Scanner input = new Scanner(System.in);

Är inte input (eller vad jag nu skriver där) variabeln för detta objekt?
Måste jag ange den först som double input; och sen skriva som jag skrev?

Permalänk
Medlem

Jo, input är namnet på variabeln där du skapar en "instans" av klassen scanner. Du kan inte ange den som double eftersom du tilldelar den ett objekt av typen Scanner!

Skickades från m.sweclockers.com

Permalänk
Medlem
Skrivet av friflygare:

Är inte input (eller vad jag nu skriver där) variabeln för detta objekt?
Måste jag ange den först som double input; och sen skriva som jag skrev?

Hur man benämner något beror ofta på syftet. Pratar du om en variabel så handlar det oftast om något som är avsett att vid olika tillfällen innehålla olika värden. Man skulle även kunna tänka sig att benämna input som ett Scanner-objekt, en instans av Scanner, en referens till en specifik Scanner, namnet på en specifik scanner etc.
Eftersom input skulle kunna riktas om till en annan Scanner (d.v.s. låta innehållet variera), t.ex. med
Scanner input = new Scanner(System.in);
input = new Scanner(new File("aFile.txt"));

är det dock inte tekniskt fel att benämna input variabel.

double input; använder du om input skall innehålla en double.
Scanner input; använder du om input skall innehålla (eller rättare sagt referera till) en Scanner.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD

Permalänk

Tack för hjälpen, skoj när man får beskrivning från olika håll och det ger verkligen mycket. Många pusselbitar som ramlar på plats just nu mest hela tiden när man jobbar och det är skönt. Nu förstår jag lite mer hur man ska jobba med variabeln.

Permalänk

Har stött på lite patrull när jag ska ersätt ord med hjälp av metoden replace. Jag kan inte lägga till flera ord i koden och få det att funka. Jag vill alltså lägga till att "bu" och "bä" ska bytas ut mot "varmt" och kallt". Har provat med "bu" + "bä", "varmt" + "kallt" men det och några andra kombinationer jag har provat fungerar ej. Kan nån hjälpa mig?

import java.util.Scanner; public class BytaUt { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.print("bu och bä ska bytas ut mot kallt och varmt, skriv in och kontrollera: "); String text = input.nextLine(); // Jag får det inte att funka på denna linje när jag vill ha flera ord från texten att // bytas ut! Det funkar som det ser ut nu men hur // ska jag göra för att lägga till flera ord? String tmpText = text.replaceAll("bu", "kallt"); System.out.println(tmpText); } }

Permalänk
Medlem
Skrivet av friflygare:

Har stött på lite patrull när jag ska ersätt ord med hjälp av metoden replace. Jag kan inte lägga till flera ord i koden och få det att funka. Jag vill alltså lägga till att "bu" och "bä" ska bytas ut mot "varmt" och kallt". Har provat med "bu" + "bä", "varmt" + "kallt" men det och några andra kombinationer jag har provat fungerar ej. Kan nån hjälpa mig?

Enkelt, lägg på en eller flera extra .replaceAll().

Exempel:

"abc".replaceAll("a", "x").replaceAll("b", "y").replaceAll("c", "z");

Roligare variant!

// en "karta" mellan ord. HashMap<String, String> map = new HashMap<String, String>(); map.put("ett", "bra"); map.put("detta", "ni"); map.put("test!", "latin"); map.put("är", "talar"); String input = "Detta är ett test!"; // detta är ett fult sätt att lösa uppgiften på, men ganska enkelt att förstå. for (String word : input.split(" ")) { String replacement = map.get(word.toLowerCase()); if (replacement != null) { input = input.replaceAll(word, replacement); } }

Visa signatur

Kom-pa-TI-bilitet

Permalänk

Tack för all hjälp, mycket trevligt. Håller på med lite andra grejer just nu och har en uppgift där följande program ska göras i Java.

Ett program där man matar in 4 ord separerade med * (exempelvis Hej*jag*heter*friflygare). Dessa fyra ord ska sedan kastas om, först kommer sist osv. Jag ska använda mig av indexOf, substring och length metoder.

Jag tänkte först att man med hjälp av indexOf får ut var alla * är och på det sättet kan dela in ordet i separat variabel för att sedan bara skriva ut det i den ordning man behagar i koden. Har kommit så långt att jag kan kasta om två ord men kommer inte längre.

Kan man på något sätt binda de fyra orden i fyra olika variabel ?
Hur kan man i egenskaperna få att läsa från andra * i Ord3 t.ex, har problemet att komma till den andra * i Mening ?

import java.util.Scanner; public class Ordning { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("Skriv in en mening på fyra ord separerade med * enligt " + "detta mönster Jag*heter*Johan*Svensson och avsluta med enter: "); String Mening = input.nextLine(); int starPos = Mening.indexOf ( "*" ); String Ord1 = ""; Ord1 = Mening.substring(0,starPos); String Ord2 = ""; Ord2 = Mening.substring((starPos + 1), Mening.length()); // Hur ska jag här kunna få in att den ska börja läsa från andra starPos? //String Ord3 = ""; //Ord3 = Mening.substring((starPos+starPos), Mening.length()); //String Ord4 = ""; //Ord4 = Mening.substring((starPos + 1) +2, Mening.length()); String Blandat = ""; Blandat = Ord2 + " " + Ord1; System.out.println(Blandat); } }

Permalänk
Medlem

Istället för att spara varje ord i en egen String-variabel kanske du borde använda en String-array.

När man programmerar så är det viktigt att man förstår problemet (och hur det skall lösas), varför det är en god idé att formulera sina algoritmer i 'mänskligt' språk innan man skriver kod.

Här följer ett par tips du kan utgå från när du formulerar din lösning:

Skapa en int-array med positionerna för alla asterisker. Låt oss anta att du gjort detta för meningen "Hej*jag*heter*friflygare". Då har du en array som ser ut såhär: {3, 7, 13}. Till detta vet du också att meningen startar på index 0 och slutar på length-1 (=23). Nu kan du lätt räkna ut hur många ord som finns och var i strängen de befinner sig.

Ett annat sätt att angripa problemet är att
1. Placera texten fram till den första asterisken i en String-array
2. Ta bort texten t.o.m. den första asterisken från meningen
3. Upprepa från steg 1 tills inga mer asterisker kan hittas, placera då resterande text i String-arrayen
I String-arrayen finns nu alla ord i ordning; att vända på ordföljden är då enkelt.

Visa signatur

Laptop: Dell Latitude E7270 | 12,5" FHD IPS | i5-6300U | 16GB RAM | 500GB SSD
Laptop: MacBook Air 13"
NUC: Intel i5-4250U | 8GB RAM | 250GB SSD