subexpression

troneleck

Mitglied
Hallo,

ich möchte einer Methode einen Variablennamen mitgeben.
Der Name steht innerhalb eines Objects an 1ter stelle.

Code:
Object [][] obj = {{"Paul", "Schultz", 39},{"Tina","Müller",22}};

Ich gehe mit einer Foreach-Schleife durch das Object.
Code:
for(Object e : obj){

tuwas(e[0]);
};

"Paul" wäre im ersten Durchgang der Name der Variable und "Tina" im zweiten Durchgang.
Nun ist das Problem das e[0] verwendet wird und nicht "Paul" oder "Tina".

Mit Powershell wäre es $().
Code:
$($mach_das_zuerst)

Ich bin auf der suche nach einer Möglichkeit etwas innerhalb einer Codezeile als erstes aufzurufen, gleich den Klammern in der Mathematik.

mfg Jones
 

mrBrown

Super-Moderator
Mitarbeiter
Ich verstehe weder das Problem, noch deine Erklärung.

e[0] ist doch im erst Durchlauf „Paul“, im zweiten „Tina“
 

troneleck

Mitglied
Leider nein.

Es ist in diesem Fall "e[0]", da das Object und der Index nicht ausgewertet werden.

Ist Script:

Java:
package tron;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;

@net.minecraftforge.fml.common.Mod(modid = tronsmod.MODID, version = tronsmod.VERSION)
public class tronsmod {

     public static final String MODID = "tronsmod";
        public static final String VERSION = "1.0";
 
    
        @EventHandler
        public void preInit(FMLPreInitializationEvent event){
        
                            
         
         
//             Dont repeat yourself!!!!!!
            ItemStack gold = new ItemStack (Items.GOLD_INGOT);
             ItemStack nstar = new ItemStack (Items.NETHER_STAR, 64);
            ItemStack dia = new ItemStack (Items.DIAMOND);
            ItemStack lo = new ItemStack (Items.BLAZE_ROD, 64);
            ItemStack glow = new ItemStack (Items.GLOWSTONE_DUST);
         
         
 
         
        
               GameRegistry.addRecipe(nstar,"ggg","gdg","ggg",'g', gold,'d', dia);
            GameRegistry.addRecipe(lo,"d  "," d ","  g", 'g' , gold,'d',glow);
            }
    
    
        @EventHandler
        public void init(FMLInitializationEvent event)
        {
        
        }
 
    @EventHandler
    public void postInit(FMLPostInitializationEvent event){
    
    }
    
}



Soll Script:
Java:
package tron;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;

@net.minecraftforge.fml.common.Mod(modid = tronsmod.MODID, version = tronsmod.VERSION)
public class tronsmod {

     public static final String MODID = "tronsmod";
        public static final String VERSION = "1.0";
 
    
        @EventHandler
        public void preInit(FMLPreInitializationEvent event){
        
                             
         
        
            // was ist hier falsch?
         
            Object[][] obj = {{"gold","GOLD_INGOT",1},{"nstar","NETHER_STAR",64},{"dia","DIAMOND",1},{"lo","BLAZE_ROD",64},{"glow", "GLOWSTONE_DUST", 1}};
        
            for (Object[] e :obj){
             
                ItemStack e[0] = new ItemStack (Items.e[1],e[2]);
                 };
         
        
               GameRegistry.addRecipe(nstar,"ggg","gdg","ggg",'g', gold,'d', dia);
            GameRegistry.addRecipe(lo,"d  "," d ","  g", 'g' , gold,'d',glow);
            }
    
    
        @EventHandler
        public void init(FMLInitializationEvent event)
        {
        
        }
 

 
    @EventHandler
    public void postInit(FMLPostInitializationEvent event){
    
    }
    
}

Das wird als Fehlerhaft gemeldet:
ItemStack e[0] = new ItemStack (Items.e[1],e[2]);

wenn ich mit der Mouse auf das "e" gehe bekomme ich die Meldung, "Duplicate local variable e", daher vermute ich das er "e[0]" als neues Object anlegen will und nicht "gold" ,"nstar"......

mfg Jones
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
e[0] kann nicht mit Typ deklariert werden, weil es schon deklariert ist.
Lass einfach das ItemStack davor weg.

Und Object[][]? Das ist ja grausam ;)
 

troneleck

Mitglied
Zum Thema Object[][]..als Anfänger weis ich nicht wie man das anders macht.
Eigentlich wollte ich Liste Object oder Array Object....ich weis aber nicht wie das geht:confused:.
Alle Tutorials die ich gefunden habe zeigen nicht wie ich das Statisch füllen kann. ({{irgendwas,irgendwas},{dieses,jenes,656},......})

ItemStack wegzulassen fühlt sich irgendwie nicht richtig an, zumal "Items.e[1]" weiterhin als Falsch angezeigt wird.
Ich vermute, das er nicht "Items.GOLD_INGOT" aufruft, sondern e[1] nicht interpretiert.
(Für sowas giebt es unter Powershell $())
 
Zuletzt bearbeitet:

troneleck

Mitglied
Danke für die Antwort.

Das muss aber weg.
Ah, Items hat kein Array e, was Dinge enthält, sondern zB GOLD_IGNOT als Variable?
Jup.

Das muss aber weg.
Das ist so in Java nicht möglich - dafür muss man andere Datenstrukturen, zB Map nutzen

Ich hab bisher kein Tutorial gefunden was Map in Verbindung mit einem Object nutzt OHNE "add".
Ich möchte kein .add verwenden da es mit "dry" nicht vereinbar ist. (aus meiner Sicht)
Was ich gedanklich benötige wäre: {mykey, {"string","string",int},mykey2,{"string","string",int}} Ist das Möglich??


Wie erstelle ich eine passende Map?
Wie müsste die Iteration, bei Verwendung von map, anders aussehen?

mfg Jones
 

mrBrown

Super-Moderator
Mitarbeiter
Ich möchte kein .add verwenden da es mit "dry" nicht vereinbar ist. (aus meiner Sicht)
Was ich gedanklich benötige wäre: {mykey, {"string","string",int},mykey2,{"string","string",int}} Ist das Möglich??
Was meinst du mit „dry“?
Und was spricht gegen ein add?

Möglich ist alles, du solltest halt nur sinnvolle Objekte dafür erstellen, und nicht Arrays von Objekten nutzen
 

troneleck

Mitglied
dry = don't repeat yourself !

wenn ich add oder put nutze, ist das gefühlt das gleiche als ob ich den neuen ItemStack per Hand erstelle.

Also
add("gold","GOLD_INGOT",1);
add("erde","DIRT",1);
+ Iteration
fühlt sich für mich genauso an wie

ItemStack gold = new ItemStack (Items.GOLD_INGOT,1);
ItemStack erde = new ItemStack (Items.DIRT,1);

Oder anders ausgedrückt, wenn ich ein if else Konstrukt habe, mit 10 nahezu identischen if else Anweisungen , dann könnte ich daraus auch einen verschachtelten ternary operator machen weil weniger zu schreiben aber die kürzeste (mir bekannte) Variante wäre Dict/Map zu verwenden.

ItemStack per Hand wäre == if else
add == ternary operator
Dict/Map + iteration == das was ich mir erhoffe machen zu können

mfg Jones
 

tommysenf

Top Contributor
Java:
@EventHandler
public void preInit(FMLPreInitializationEvent event){
            ItemStack gold = new ItemStack(Items.GOLD_INGOT);
            GameRegistry.addRecipe(new ItemStack(Items.NETHER_STAR, 64),"ggg","gdg","ggg",'g', gold,'d', new ItemStack(Items.DIAMOND));
            GameRegistry.addRecipe(new ItemStack(Items.BLAZE_ROD, 64),"d  "," d ","  g", 'g' , gold,'d',new ItemStack (Items.GLOWSTONE_DUST));
}
 

mrBrown

Super-Moderator
Mitarbeiter
dry = don't repeat yourself !

wenn ich add oder put nutze, ist das gefühlt das gleiche als ob ich den neuen ItemStack per Hand erstelle.

Also
add("gold","GOLD_INGOT",1);
add("erde","DIRT",1);
+ Iteration
fühlt sich für mich genauso an wie

ItemStack gold = new ItemStack (Items.GOLD_INGOT,1);
ItemStack erde = new ItemStack (Items.DIRT,1);

Oder anders ausgedrückt, wenn ich ein if else Konstrukt habe, mit 10 nahezu identischen if else Anweisungen , dann könnte ich daraus auch einen verschachtelten ternary operator machen weil weniger zu schreiben aber die kürzeste (mir bekannte) Variante wäre Dict/Map zu verwenden.

ItemStack per Hand wäre == if else
add == ternary operator
Dict/Map + iteration == das was ich mir erhoffe machen zu können

mfg Jones
Mit Maps sähe das ganze etwa so aus:
map.put(„gold“, new ItemStack(...));. Das kann man natürlich in einer Methode kapseln.
Und zum bekommen dann map.get(„gold“);.
Mit Java9 noch etwas kürzer, ich weiß allerdings nicht, ob’s bei dir möglich ist.


Sauberer als deine beiden Varianten oben ist es in jedem Fall ;)
 

Harry Kane

Top Contributor
Mir ist auch nicht ganz klar, warum das Erzeugen mehrerer Instanzen gegen DRY verstoßen soll.
Wenn du natürlich jede Instanz noch mit jeweils ein paar weiteren, sehr ähnlichen oder identischen Codezeilen formatierst, bietet es sich in der Tat an, das ganze in eine Methode auszulagern.
Aus meiner Sicht ist ist es nicht mehr oder weniger DRY, wenn du die Instanzen von Hand erstellst oder dir die ganzen Parameter in einen mehrdimensionale Collection oder Array packst, darüber iterierst, und mit den während aus der Iteration aus der Collection gezogenen Informationen die Instanzen erstellst. Ich würde aus Gründen der Übersichtlichkeit aber die erste Variante (Instanzen von Hand erstellen) stark bevorzugen.
Als ich frisch angefangen hatte zu programmieren, habe ich aber auch gedacht, Variante 2 wäre die "bessere".
 

Neue Themen


Oben