Come si fa a far fronte a Java proveniente da javascript?

5

Ho imparato alcuni javascript come introduzione alla programmazione, e ora sto cercando di passare a Java e Python e da lì a c ++, c #, ecc.

Sono stato coinvolto nel lavoro scolastico, quindi ho avuto pochissime possibilità di imparare ancora qualcosa, ma mi sono aggirato intorno a SO alla ricerca di semplici domande Java che avrei potuto chiedermi e provare ad imparare dalle risposte .

Ne ho visto uno che era piuttosto interessante. Si trattava di un compito a casa per trovare l'ordine di lavoro più efficiente da fare, supponendo che ogni lavoro richiedesse due giorni e doveva essere in ordine sequenziale. Avrei potuto farlo facilmente in javascript, ma non riesco a capire come funziona in Java. Con javascript vorrei solo restituire un array bidimensionale. Ogni elemento è un array contenente il profitto e le giornate di lavoro. Ignorando se sia un modo stupido di restituire dati in javascript, qual è il modo corretto per restituire dati come questo in Java?

In altre parole, l'array javascript che vorrei restituire sarebbe simile a:

[['1-3-5', 50], ['2-5-8', 90], ['2-4-7', 75]]

In Java, dovrei convertire gli interi in stringhe per iniziare, e poi trovare un modo per concatenare due array bidimensionali ... Inutile dire che questo è il modo sbagliato per farlo.

    
posta mowwwalker 04.10.2011 - 08:45
fonte

5 risposte

8

Utilizzare gli array per tutto è una cattiva idea. Anche in JavaScript. Ma in Java lo è ancora di più, perché gli array sono molto più ristretti in Java.

Gli elementi del tuo array di restituzione rappresentano di fatto i risultati. Dovresti comunicarlo di conseguenza:

class Result {
     public int someInt;//no idea what this actually is, but a class will allow you giving it a proper name
     public String someString;//same as with the other field. Also, I suppose String is actually wrong here, since it rather looks like a '-'-separated list of integers, which should rather be represented as an array of integers
     Result(String someString, int someInt) {
           this.someString = someString;
           this.someInt = someInt;
     }
}

E quindi il tuo valore di ritorno dovrebbe essere qualcosa del tipo:

ArrayList.ofList(new Result('1-3-5', 50), new Result('2-5-8', 90), new Result('2-4-7', 75))
    
risposta data 04.10.2011 - 09:44
fonte
7

Java non è JavaScript. Devi liberarti delle abitudini di digitazione libera di JavaScript per apprezzare il sistema di tipi di Java.

Nelle lingue rilassate si ottimizza per l'implementazione facile della funzione chiamata. Poiché la funzione può accettare e restituire dati in qualsiasi formato, rende l'implementazione della funzione senza un sovraccarico. Il rovescio della medaglia è che chi chiama la tua funzione deve guardare il codice sorgente della tua funzione per sapere quali dati accetta e quali dati restituisce. Questo è efficiente per un singolo programmatore (supponendo che tu possa ricordare le tue funzioni) e inefficiente per una squadra (tutti devono leggere tutto il codice sorgente).

In linguaggi rigorosi, come Java, si ottimizza per un'implementazione facile da parte del chiamante della funzione. Il chiamante sa quale formato di dati accetta la funzione e quale formato di dati restituisce la funzione. Più rigorosamente definisci questi formati di dati, più le cose diventano facili per il chiamante. Possono contare sulla firma della funzione, senza guardare il codice sorgente, per sapere come usare la funzione. Questo è inefficiente per un singolo programmatore, ma efficiente per un team (le persone possono trattare funzioni come le scatole nere).

In questo caso specifico dovresti riflettere attentamente su come questa funzione possa definire il suo input e output in modo che diventi una scatola nera. Non restituiresti array di stringhe. Si restituiscono elenchi di oggetti di un tipo specifico (possibilmente auto-dichiarato).

    
risposta data 04.10.2011 - 09:35
fonte
5

In primo luogo, ti consiglio di liberarti dell'idea che Java e Javascript siano in qualche modo collegati. È un malinteso comune con i nuovi arrivati, ma a parte il nome e alcune delle sintassi di base, sono strettamente correlati come C ++ e Python.

Ora, non sto capendo i requisiti del problema reale (cosa rappresenta la stringa di numeri?) ma se stai cercando di decidere quali strutture dati usare in Java, il posto dove guardare è < a href="http://download.oracle.com/javase/6/docs/api/java/util/package-summary.html"> pacchetto java.utils .

    
risposta data 04.10.2011 - 09:19
fonte
2

Needless to say, this is the wrong way to go about it.

Non necessariamente. Qualunque cosa faccia il lavoro a portata di mano in modo comprensibile, verificabile e affidabile è un buon modo per farlo. A livello di astrazione della struttura dei dati, si può pensare più o meno alla lingua in modo agnostico.

Ora, le lingue con un sistema di tipi strong come Java ti spingono un po 'verso strutture di dati buone e ponderate, perché gli hacker sporchi come il tuo vettore di stringa 2xX non sono molto più facili da usare.

Quindi, ciò a cui dovrai pensare nel fare la tua transizione è come pensi sui tuoi dati e metti questa struttura in una struttura dati. Cioè, probabilmente dichiareresti una classe WorkLoad che consiste in un elenco di oggetti WorkItem, ognuno dei quali consiste in un numero di giorni della settimana (o qualunque cosa si trovi nel tuo primo elemento dell'array, non può dirlo guardando i tuoi dati ) e un profitto.

    
risposta data 04.10.2011 - 09:18
fonte
-1

Vorrei andare per qualcosa di simile

public class Main {
  // ...
  public static class Item {
     private List<Integer> list = new ArrayList<Integer>(); // good when you need add elements
     //or: private int[] array; // instantiate when you know number of olements
     private int something;
     // getters, maybe setters (or fill data in constructor and don't allow changing them
     // int that case, don't expose array/list, make accesor methods instead
  }

  public List<Item> yourFunction() {
       // something
  }
}  
    
risposta data 04.10.2011 - 15:35
fonte

Leggi altre domande sui tag