Een string-array converteren naar een integer-array

dus in feite voert de gebruiker een reeks in vanaf een scannerinvoer.
12, 3, 4, enz.
Het kan elke lengte hebben en het moeten gehele getallen zijn.
Ik wil de string-invoer converteren naar een integer-array.
dus int[0] zou 12 zijn, int[1] zou 3 zijn, enz.

Heeft u tips en ideeën? Ik dacht aan het implementeren van if charat(i) == ',' haal de vorige nummer(s) en ontleden ze samen en pas het toe op het huidige beschikbare slot in de array. Maar ik weet niet precies hoe ik dat moet coderen.


Antwoord 1, autoriteit 100%

Je zou de hele invoerregel van de scanner kunnen lezen en de regel vervolgens kunnen splitsen door , dan heb je een String[], ontleden elk nummer in int[] met index één op één overeenkomend…(uitgaande van geldige invoer en geen NumberFormatExceptions) zoals

String line = scanner.nextLine();
String[] numberStrs = line.split(",");
int[] numbers = new int[numberStrs.length];
for(int i = 0;i < numberStrs.length;i++)
{
   // Note that this is assuming valid input
   // If you want to check then add a try/catch 
   // and another index for the numbers if to continue adding the others (see below)
   numbers[i] = Integer.parseInt(numberStrs[i]);
}

Zoals YoYo’s antwoord suggereert, kan het bovenstaande beknopter worden bereikt in Java 8:

int[] numbers = Arrays.stream(line.split(",")).mapToInt(Integer::parseInt).toArray();  

Ongeldige invoer afhandelen

U zult moeten overwegen wat u in dit geval wilt doen, wilt u weten dat er een slechte invoer was bij dat element of wilt u het gewoon overslaan.

Als u niets wilt weten over ongeldige invoer, maar gewoon door wilt gaan met het ontleden van de array, kunt u het volgende doen:

int index = 0;
for(int i = 0;i < numberStrs.length;i++)
{
    try
    {
        numbers[index] = Integer.parseInt(numberStrs[i]);
        index++;
    }
    catch (NumberFormatException nfe)
    {
        //Do nothing or you could print error if you want
    }
}
// Now there will be a number of 'invalid' elements 
// at the end which will need to be trimmed
numbers = Arrays.copyOf(numbers, index);

De reden dat we de resulterende array moeten inkorten, is dat de ongeldige elementen aan het einde van de int[] worden weergegeven door een 0, deze moeten worden verwijderd om onderscheid te maken tussen een geldige invoerwaarde van 0.

Resultaten in

Invoer: “2,5,6,slecht,10”
Uitgang: [2,3,6,10]

Als u later meer wilt weten over ongeldige invoer, kunt u het volgende doen:

Integer[] numbers = new Integer[numberStrs.length];
for(int i = 0;i < numberStrs.length;i++)        
{
    try 
    {
        numbers[i] = Integer.parseInt(numberStrs[i]);
    }
    catch (NumberFormatException nfe)   
    {
        numbers[i] = null;
    }
}

In dit geval slechte invoer (geen geldig geheel getal) is het element null.

Resultaten in

Invoer: “2,5,6,slecht,10”
Uitgang: [2,3,6,null,10]


Je zou de prestaties mogelijk kunnen verbeteren door de uitzondering niet op te vangen (zie deze vraag voor meer informatie hierover) en gebruik een andere methode om te controleren op geldige gehele getallen.


Antwoord 2, autoriteit 63%

Lijn voor regel

int [] v = Stream.of(line.split(",\\s+"))
  .mapToInt(Integer::parseInt)
  .toArray();

Antwoord 3, autoriteit 9%

Stream.of().mapToInt().toArray() lijkt de beste optie.

int[] arr = Stream.of(new String[]{"1", "2", "3"})
                  .mapToInt(Integer::parseInt).toArray();
System.out.println(Arrays.toString(arr));

Antwoord 4, autoriteit 4%

Het converteren van String-array naar stream en toewijzen aan int is de beste optie die beschikbaar is in Java 8.

    String[] stringArray = new String[] { "0", "1", "2" };
    int[] intArray = Stream.of(stringArray).mapToInt(Integer::parseInt).toArray();
    System.out.println(Arrays.toString(intArray));

Antwoord 5, autoriteit 4%

Voor Java 8 en hoger:

    String[] test = {"1", "2", "3", "4", "5"};
    int[] ints = Arrays.stream(test).mapToInt(Integer::parseInt).toArray();

Antwoord 6

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class MultiArg {
    Scanner sc;
    int n;
    String as;
    List<Integer> numList = new ArrayList<Integer>();
    public void fun() {
        sc = new Scanner(System.in);
        System.out.println("enter value");
        while (sc.hasNextInt())
            as = sc.nextLine();
    }
    public void diplay() {
        System.out.println("x");
        Integer[] num = numList.toArray(new Integer[numList.size()]);
        System.out.println("show value " + as);
        for (Integer m : num) {
            System.out.println("\t" + m);
        }
    }
}

maar om de while-lus te beëindigen, moet je een willekeurig teken aan het einde van de invoer zetten.

bijv. invoer:

12 34 56 78 45 67 .

uitvoer:

12 34 56 78 45 67

Antwoord 7

Java heeft hier een methode voor, “convertStringArrayToIntArray”.

String numbers = sc.nextLine();
int[] intArray = convertStringArrayToIntArray(numbers.split(", "));

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes