Resolución de código sin ciclo extra fuera del bucle -- # campo con array camp codereview Relacionados El problema

Solving code without extra cycle outside for loop


4
vote

problema

Español

Este código lee el diámetro de barril y la altura del archivo, luego, en función de la dimensión, tome decisiones y, finalmente, estas decisiones se imprimen a un archivo. Mi pronbelm es ¿cómo evitar usar el código WRTINE en las líneas 70-101? Probablemente tiene que ver con la Línea 35, pero no he descubierto a mi alrededor. Sería bueno si hay una manera (oportunidad) para que este código sea más corto.

P.S D Diámetro, H - Altura

  import java.util.Random;  public class QuickSorter {     public static void main(String[] args) {         Random random = new Random();         int[] randoms = new int[10000];         for(int i = 0; i < randoms.length; i++) randoms[i] = random.nextInt(10000);          quickSort(randoms, 0, randoms.length);         System.out.println(Arrays.toString(randoms));     }      /** Same as {@link #quickSort(int[], int, int)}, but assumes the whole array should be sorted. */     public static void quickSort(int[] in) {quickSort(in, 0, in.length);}     /** Sorts an array of integers using the Quicksort algorithm, in the range [{@code start}, {@code end}).      * @param in The full array to sort      * @param start The starting index, inclusive      * @param end The ending index, exclusive      * @see #quickSort(int[]) */     public static void quickSort(int[] in, int start, int end) {         int pivot = (start + end) / 2;          /* Temporary array containing the ordered sub-list */         int[] sub = new int[end - start];         int left = 0, right = sub.length;          /* Populate the sub-list */         for(int i = start; i < end; i++) {             if(i == pivot) continue;              if(in[i] < in[pivot]) {                 sub[left++] = in[i];             } else {                 sub[--right] = in[i];             }         }         /* Add in the original pivot in its new position */         sub[left] = in[pivot];          /* Copy back into the original array */         for(int k = start; k < end; k++) {             in[k] = sub[k - start];         }          /* Translate new pivot position into full list index */         left += start;         if(left - start > 0) quickSort(in, start, left);         /* The start of the right branch should not include the pivot */         left++;         if(end - left > 0) quickSort(in, left, end);     } } 0  
Original en ingles

This code reads barrel diameter and height from file, then, based on dimension make decisions and finally these decisions are printed out to a file. My pronbelm is how to avoid using the code wrtine on lines 70-101? Probably has to do with line 35, but I havenxc2xb4t figured my way around it. Would be nice if there is a way (chance) to make this code shorter.

P.S d - diameter, h - height

    using System;     using System.Collections.Generic;     using System.IO;     using System.Linq;           namespace TaaviSimsonTest     {         class Program         {             static void Main(string[] args)             {                 //Reads values from an input file                 var numbersList = File.ReadAllLines("C:\\temp\\vaaditest07.txt")                     .Select(line => line.Split(' '))                     .Select(barrels => new                     {                         diameter = int.Parse(barrels[0]),                         height = int.Parse(barrels[1])                     })                     .ToArray();                       //Puts diameter and height values to arrays                 int[] d = numbersList.Select(x => x.diameter).ToArray();                 int[] h = numbersList.Select(x => x.height).ToArray();                       //Displays numbersList with line number, diameter and height                 for (int i = 0; i < d.Length; i++)                 {                     Console.WriteLine("Line {0}: diameter: {1}, height: {2}",                          i, d[i], h[i]);                 }                       //comparing barrel sizes and making a decision                 List<string> output = new List<string>();                 for (int j = 0; j < (d.Length - 1); j++)                 {                     int a = j + 1;                     int b = j + 2;                     if (d[j] > d[j + 1] && h[j] > h[j+1])                     {                         string command = a + "<-" + b;  //1 <- 2, if j = 0                         output.Add(command);            //puts command in array                     }                     else if (d[j] < d[j + 1] && h[j] < h[j+1])                     {                         string command = a + "->" + b;                         output.Add(command);                     }                     else if (d[j+1] < h[j] &&                                ((d[j+1] * d[j+1] + h[j+1] * h[j+1]) <                         d[j] * d[j]))                     {                         string command = a + "<-" + b;  // 2 <- 3                         output.Add(command);                     }                     else if(d[j] < h[j+1] &&                             ((d[j] * d[j] + h[j] * h[j]) <                         d[j+1] * d[j+1]))                     {                         string command = a + "->" + b;                         output.Add(command);                     }                     else                     {                         string command = a + "--" + b;                         output.Add(command);                     }                 }                       //how to avoid this cycle?                 int c = 1;                 int e = d.Length;                 if (d[0] > d[d.Length - 1] && h[0] > h[d.Length - 1])                     {                     string command = c + "<-" + e;                     output.Add(command);                 }                 else if (d[0] < d[d.Length - 1] && h[0] < h[d.Length-1])                   {                     string command = c + "->" + e;                     output.Add(command);                 }                 else if (d[d.Length-1] < h[0] &&                      ((d[d.Length-1] * d[d.Length-1] + h[d.Length-1] * h[d.Length-1]) <                      d[0] * d[0]))                 {                     string command = c + "<-" + e;                     output.Add(command);                 }                 else if (d[0] < h[d.Length-1] &&                         ((d[0] * d[0] + h[0] * h[0]) <                       d[d.Length-1]*d[d.Length-1]))                 {                     string command = c + "->" + e;                     output.Add(command);                 }                 else                 {                     string command = c + "--" + e;                     output.Add(command);                 }                       //Writes values of array to a new file                 String[] outputlist = output.ToArray();                 File.WriteAllLines(@"C:\Temp\barrelsOutput.txt", outputlist);                 //Displaying output in console                 Console.WriteLine("");                 foreach (var item in outputlist)                 {                     Console.WriteLine(item.ToString());                 }             }         }     } 
     
 
 

Lista de respuestas

11
 
vote

Algunas notas:

  • Debe hacer que su código sea más legible más a menudo. Esto le daría a su código más sentido incluso por ti mismo, especialmente si lo revisaste en el futuro.
  • Debe considerar la convención de nombres como usar la carcasa de Pascal para las propiedades, nombrando sus variables con nombres significativos.
  • No dividir la cadena sin validar primero.
  • NO Hash[*arr]1 Valores directamente, como Hash[*arr]2 a menos que esté seguro de que será un valor válido, en su lugar usar Hash[*arr]3 para evitar excepciones.
  • No cree una matriz de un tipo de tipo anónimo (o cualquier otro tipo) a menos que sea necesario (en su caso, no es necesario), use la matriz que ha creado.
  • Siempre si ve una redundancia en su código (código repetitivo), muévalo a un método, de esta manera puede reutilizar el método y sus ajustes estarían en un solo lugar.
  • Hash[*arr]4 Acepta Hash[*arr]5 Puede pasar directamente el 99887766655443326655443326. Por lo que no es necesario convertirlo a matriz.
  • Hash[*arr]7 puede concatenar un Hash[*arr]8 en uno arr.to_h0 Para que use eso a su ventaja.
  • Siempre valida sus valores tanto como sea posible, esto daría más estabilidad a su código y garantizaría sus resultados.

Su pregunta con respecto a esta parte del código:

  arr.to_h1  

Esta parte debe moverse a un método y hacerlo más generalizado para ser reutilizado, así:

  arr.to_h2  

Ahora puede reutilizarlo en su código, aquí está la versión modificada de su código:

  arr.to_h3  
 

Some Notes :

  • you should make your code more readable more often. This would give your code more sense even for yourself, specially if you reviewed it in the future.
  • you need to consider naming convention like using Pascal Casing for Properties, naming your variables with meaningful names.
  • Don't split the string without validating first.
  • Don't Parse values directly such as int.Parse unless you're sure it will be a valid value, instead use int.TryParse to avoid exceptions.
  • Don't create an array from anonymous type (or any other type) array unless if is needed (in your case it's not needed) instead, use the array that you've created.
  • Always if you see some redundancy in your code (repetitive code) move it to a method, this way you can reuse the method and your adjustments would be in one place.
  • File.WriteAllLines accepts IEnumerable this means, you can pass the List<string> directly, so no need to convert it to array.
  • string.Join can concatenate a List or Array into one string so use that to your advantage.
  • Always validate your values as much as possible, this would give more stability to your code, and ensure your results.

Your question regarding this part of code :

if (d[0] > d[d.Length - 1] && h[0] > h[d.Length - 1])     {     string command = c + "<-" + e;     output.Add(command); } else if (d[0] < d[d.Length - 1] && h[0] < h[d.Length-1])   {     string command = c + "->" + e;     output.Add(command); } else if (d[d.Length-1] < h[0] &&      ((d[d.Length-1] * d[d.Length-1] + h[d.Length-1] * h[d.Length-1]) <      d[0] * d[0])) {     string command = c + "<-" + e;     output.Add(command); } else if (d[0] < h[d.Length-1] &&         ((d[0] * d[0] + h[0] * h[0]) <       d[d.Length-1]*d[d.Length-1])) {     string command = c + "->" + e;     output.Add(command); } else {     string command = c + "--" + e;     output.Add(command); } 

This part needs to be moved into a method and make it more generalized to be reused, like this :

private static string GetCommand(int currentDiameter , int nextDiameter , int currentHeight , int nextHeight) {     var currentDiameterMultiplied = currentDiameter * currentDiameter;     var nextDiameterMultiplied = nextDiameter * nextDiameter;     var currentHeightMultiplied = currentHeight * currentHeight;     var nextHeightMultiplied = nextHeight * nextHeight;      if(currentDiameter > nextDiameter && currentHeight > nextHeight)     {         return "<-";     }      if(currentDiameter < nextDiameter && currentHeight < nextHeight)     {         return "->";     }      if(nextDiameter < currentHeight && ( ( nextDiameterMultiplied + nextHeightMultiplied ) < currentDiameterMultiplied ))     {         return "<-";     }      if(currentDiameter < nextHeight && ( ( currentDiameterMultiplied + currentHeightMultiplied ) < nextDiameterMultiplied ))     {         return "->";     }      return "--"; } 

now you can reuse it in your code, here is the modified version of your code:

static void Main(string[] args) {     //Reads values from an input file     var path = "C:\\temp\\vaaditest07.txt";          if(!File.Exists(path)) { throw new FileNotFoundException(nameof(path)); }              var data = File.ReadAllLines(path);           if(data == null) { throw new ArgumentNullException(nameof(data)); }          var numbersList = data                         .Select(line =>                              line.Split(' ')                                 .Select(barrels => new                                 {                                                            Diameter = int.TryParse(barrels[0], out var diameter) ? diameter : 0,                                     Height = int.TryParse(barrels[1], out var height) ? height : 0                                 }).ToArray();      //comparing barrel sizes and making a decision     var output = new List<string>();      var length = numbersList.Length;          var command = string.Empty;          for(int index = 0, nextIndex = 1; index < length; index++, nextIndex++)     {           var current = numbersList[index];                  var next = numbersList[nextIndex];          // Displays numbersList with line number, diameter and height         Console.WriteLine("Line {0}: diameter: {1}, height: {2}" , index , current.Diameter , current.Height);          if(index != length - 1)         {                var commandSymbol = GetCommand(current.Diameter , next.Diameter , current.Height , next.Height);             command = $"{nextIndex}{commandSymbol}{nextIndex + 1}";            }         else          {             var commandSymbol = GetCommand(numbersList[0].Diameter , current.Diameter , numbersList[0].Height , current.Height);             command = $"{0}{commandSymbol}{length}";                         }                  output.Add(command);     }          // Writes values of array to a new file     File.WriteAllLines(@"C:\Temp\barrelsOutput.txt" , output);      //Displaying output in console     Console.WriteLine();     Console.WriteLine(string.Join(Environment.NewLine, output)); }    
 
 
       
       
0
 
vote

Le recomendaría comenzar con el código de escritura que realmente es legible. También de su pregunta, realmente no sé cuál es su objetivo.

¿Quieres código corto que hagan el trabajo? Entonces diría que ya estás allí. Si desea un código legible y mantenible, tal vez intente un enfoque OO donde encapsule los bits de código en objetos que con su nombre y métodos documentan lo que realmente está haciendo.

Porque soy Waaaay demasiado perezoso para interpretar lo que está tratando de hacer en las líneas 70-101. Quiero leer los nombres y títulos y conocerlo.

Entonces, que son mis dos centavos

 

I would advice starting with writing code that is actually readable. Also from your question I don't really know what your goal is.

Do you want short code that get the job done? Then I'd say you are already there. If you want readable and maintainable code, then maybe try an OO approach where you encapsulate bits of code into objects which with their name and methods you document what you are actually doing.

Because I'm waaaay too lazy to interpret what you are trying to do at lines 70-101. I wanna read the names and titles and know it.

So, that is my two cents

 
 
 
 

Relacionados problema

2  Cargando imágenes en el fondo para una vista de tabla  ( Loading images in the background for a table view ) 
Tengo fetchData2 MÉTODO QUE LLENA MI imagesArray : func fetchData(){ let imageQuery = PFUser.query() imageQuery?.whereKey("username", contained...

6  Clase de matriz multidimensional simple en C ++ 11  ( Simple multi dimensional array class in c11 ) 
La nueva versión del código se puede revisar en Clase de matriz multidimensional simple en C ++ 11 - Seguimiento . El siguiente código implementa una clas...

7  Colecciones vacías en caché  ( Cached empty collections ) 
A menudo necesito devolver las colecciones vacías. Uno de esos días, escribí lo siguiente para devolver una instancia en caché: public static class Array<...

6  Buscar número de más en una matriz 2D  ( Find number of plus in a 2d array ) 
Problema Chargrid El CharGrid La clase encapsula una matriz de 2-D con una pareja de operaciones. INT APULUS () Busque un patrón '+' en la cuadrícu...

6  Fusionando dos varias de clases  ( Merging two array of classes ) 
Tengo esta función que debe fusionar dos matriz de clases cuando id es igual a id de Array2. Para la simplicidad, convirtí una matriz en un arraylist pa...

2  Devuelve verdadero si los elementos de una matriz no contienen uno u otro  ( Return true if the elements of an array do not contain one or the other ) 
Estoy completando gradualmente los ejercicios de codificación para Java. Aquí está el uno acabo de hacer: Dada una matriz de INTS, devuelva verdadera si ...

6  Palindrome más largo en una matriz  ( Longest palindrome in an array ) 
Soy nuevo en la programación, y creo que este código podría mejorarse. ¿Alguna sugerencia? 'done'0 ...

5  Encuentra el primer número único de la matriz  ( Find first unique number from array ) 
Se me pidió que creara una función que devuelva el primer entero único de la matriz de enteros. En un caso de éxito, la función devuelve el número único en un...

2  Importando datos en Excel  ( Importing data into excel ) 
¿Existe una forma más fácil de importar datos en una matriz de Excel u otra estructura de datos? He intentado investigar colecciones, pero he encontrado la D...

2  Mejora de la función que compara dos cadenas  ( Improving function that compares two strings ) 
Estoy aprendiendo C y he hecho esta función muy simple para comparar dos cuerdas. Me gustaría saber cómo se puede mejorar: int match(char* string1, char* s...




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