Difundir una matriz en múltiples argumentos para una función -- java campo con arrays campo con function camp Relacionados El problema

Spread an array into multiple arguments for a function


10
vote

problema

Español

¿Cómo puedo pasar una matriz como tres argumentos a una función en Java? (Perdóname, soy muy nuevo en Java).

Tengo la siguiente función que toma float r, float g, float b, float a como argumentos.

  renderer.prepare(r, g, b, 1);   

y quiero pasar la salida de esta función (o averiguar cómo devolver tres flotadores separados desembalados).

  public static float[] rgbToFloat(int r, int g, int b) {     return new float[] {(float) r / 255f, (float) g / 255f, (float) b / 255f}; }   

¿Cómo puedo hacer esto? En algunos otros idiomas se vería algo así:

  renderer.prepare(...rgbToFloat(25, 60, 245), 1);    
Original en ingles

How can I pass an array as three arguments to a function in Java? (Forgive me, I'm very new to Java).

I have the following function which takes float r, float g, float b, float a as arguments.

renderer.prepare(r, g, b, 1); 

And I want to pass the output from this function in. (Or figure out how to return three separate unpacked floats).

public static float[] rgbToFloat(int r, int g, int b) {     return new float[] {(float) r / 255f, (float) g / 255f, (float) b / 255f}; } 

How can I do this? In some other languages it would look something like this:

renderer.prepare(...rgbToFloat(25, 60, 245), 1);  
        
       
       

Lista de respuestas

2
 
vote

Este es un ejemplo típico de un "problema X-Y". Su búsqueda original fue a otro grupo los 3 parámetros diferentes que desea pasar a una función. Ese es "problema x". Luego se le ocurrió la idea de usar una matriz para esto, pero aún no está seguro de cómo hacerlo, por lo que publicó esta pregunta preguntando cómo usar mejor una matriz para lograr lo que quiere. Pero eso es "Problema Y", no "Problema X".

El uso de una matriz puede y puede que no sea la forma correcta de resolver "Problema X". (Spoiler: no es.)

En honor al principio de la menor sorpresa, la mejor manera de resolver su problema "X" en mi opinión es declarando una nueva clase, FloatRgba que encapsula los cuatro flotadores en los miembros del flotador individuales: < Código> final float r; final float g; final float b; final float a; .

Entonces, entonces su método rgbToFloat()2 no tiene que devolver una matriz de flotador no identificada, en su lugar, se convierte en un método 9988777663 de fábrica FloatRgba :

  public static FloatRgba fromIntRgb( int r, int g, int b )  {     return new FloatRgba( r / 255f, g / 255f, b / 255f, 1.0f ); }   

Finalmente, introduce una función de utilidad prepareRenderer que acepta un Renderer y un FloatRgba e invoca renderer.prepare(float, float, float, float) Passing son los miembros individuales de final float r; final float g; final float b; final float a;0 .

De esta manera, usted mantiene todo claro, autodifumente y muy escrito. Sí, es un poco inconveniente verboso, pero eso es Java para ti.

 

This is a typical example of an "X-Y Problem". Your original quest was to somehow group the 3 different parameters that you want to pass to a function. That's "problem X". Then you came up with the idea of using an array for this, but you were still unsure how to go about it, so you posted this question asking how to best use an array to achieve what you want. But that's "problem Y", not "problem X".

Using an array may and may not be the right way of solving "problem X". (Spoiler: it isn't.)

Honoring the principle of the least surprise, the best way of solving your problem "X" in my opinion is by declaring a new class, FloatRgba which encapsulates the four floats in individual float members: final float r; final float g; final float b; final float a;.

So, then your rgbToFloat() method does not have to return an unidentified array of float, instead it becomes a static factory method of FloatRgba:

public static FloatRgba fromIntRgb( int r, int g, int b )  {     return new FloatRgba( r / 255f, g / 255f, b / 255f, 1.0f ); } 

Finally, you introduce a utility function prepareRenderer which accepts a Renderer and a FloatRgba and invokes renderer.prepare(float, float, float, float) passing it the individual members of FloatRgba.

This way you keep everything clear, self-documenting, and strongly typed. Yes, it is a bit inconveniently verbose, but that's java for you.

 
 
 
 
0
 
vote

Tal vez tarde para la pregunta original, podría ayudar a los lectores tardíos a tropezar aquí (como yo), sin embargo: prefiero recomendar convertir solo un solo parámetro para flotar:

  final float r; final float g; final float b; final float a;111  

Llamar ahora llega a

  final float r; final float g; final float b; final float a;2  

Claro, el retorno es que tiene que llamarlo tres veces ahora (como la otra rodeada, habrías tenido que almacenar la matriz en un temporal, como se muestra en los comentarios, usted no, en comparación, Han ganado mucho, ya que, al final, usted gana flexibilidad y, además, evite el objeto de matriz temporal cuando no se necesita ninguno.

Si aún insiste en la matriz, necesitará un

temporal
  final float r; final float g; final float b; final float a;3  

Pero luego me pregunto por qué no consideras alpha también:

  final float r; final float g; final float b; final float a;4  
 

Maybe late for the original question, might help late readers stumbling over here (like me), though: I rather recommend converting just one single parameter to float:

public static float rgbToFloat(int value) {     return value / 255.0f;     // don't need the cast, value will be promoted to float anyway     // as second parameter is already } 

Call now gets to

 renderer.prepare(rgbToFloat(25), rgbToFloat(60), rgbToFloat(245), 1); 

Sure, the draw back is that you have to call it three times now (as the other way round, you would have had to store the array in a temporary as shown in the comments, you wouldn't, in comparison, have gained much either), in the end, you gain flexibility for and additionally avoid the temporary array object when none is needed.

If you still insist on the array, you'll need a temporary

float[] rgb = rgbToFloat(r, g, b); renderer.prepare(rgb[0], rgb[1], rgb[2], 1.0f); 

But then I wonder why you don't consider alpha as well:

public static float[] rgbToFloat(int r, int g, int b) {     return rgbToFloat(r, g, b, 255); } public static float[] rgbToFloat(int r, int g, int b, int a) {     return new float[] { r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f }; } 
 
 

Relacionados problema

0  Pregunta de propiedad de funciones  ( Functions property question ) 
es esta propuesta verdadera? para todas las funciones f f (a + b) = f (a) + f (b) . En caso afirmativo, entonces, ¿por qué? Si no, ¿cuáles son las fun...

3  Puntero de función a las funciones de miembro de la clase de plantilla  ( Function pointer to template class member functions ) 
Tengo una clase plantelada definida (en parte) como template <class T> MyClass { public: void DoSomething(){} }; Si quiero llamar a DoSomething de o...

59  __attribute__ en gnu c  ( Attribute in gnu c ) 
¿Por qué y cómo es __attribute__ usado en los programas de GNU C? ...

3  Problema con la salida del programa  ( Problem with program output ) 
A continuación es mi programa y estoy teniendo un problema con la función determinante. La entrada del archivo es: 2 1 0 0 1 3 8 9 1 3 5 2 -2 3 -1 0 ...

1  ¿Cómo puedo estimar la forma logarítmica de los puntos de datos usando R?  ( How can i estimate the logarithmic form of data points using r ) 
Tengo puntos de datos que representan una función logarítmica. ¿Hay un enfoque donde pueda estimar la función que describe estos datos utilizando R? graci...

0  Llamando a Def en Ruby para exportar CSV  ( Calling def in ruby for exporting csv ) 
Actualmente tengo algún código que IV usó para exportar una tabla desde los datos que tengo require 'fastercsv' def dump_csv @users = User.find(:all, :or...

3  Parcela múltiples funciones en r  ( Plot multiple functions in r ) 
Pregunté anteriormente esta Pregunta que fue útil para trazar una función. Quiero probar y trazar veinte funciones en los mismos ejes para ilustrar cómo una...

2  ¿Qué significa aprobar una y variable a una función? Por ejemplo, cadena y inserción (STEMA_T POS1, Const String & Str);  ( What does it mean to pass a variable to a function e g string insert size ) 
Entiendo pasar un puntero y devolver un puntero: char * strcat ( char * destination, const char * source ); Está pasando una variable que contiene la di...

191  ¿Cómo usar la función R's Ellipsis al escribir su propia función?  ( How to use rs ellipsis feature when writing your own function ) 
El lenguaje R tiene una característica ingeniosa para definir las funciones que pueden tomar un número variable de argumentos. Por ejemplo, la función data.f...

11  ¿Cómo llamar a objetos y funciones de Java de CPYTHON?  ( How to call java objects and functions from cpython ) 
Tengo un programa Python, que se ejecuta en la implementación de Cpython, y en su interior debo llamar a una función definida en un programa Java. ¿Cómo puedo...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos