Split String i wrzucenie do listy

Split String i wrzucenie do listy
AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 143
0

Witam mam problem. Robię split na stringu tworząc listę i planuję każdą jego wartość wrzucić do Listy Integer. Nie wiem jak to zrobic...

Kopiuj
 public List<Integer> prepareIdsListFormRequest(String idList) {
        List<Integer> result = Lists.newArrayList();
        String[] lista = idList.split(",");
       

        return result;
    }
}

czy po split trzeba to przeparsować jakoś w pętli ? Nie wiem sam jak się zabrać za to.

caer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 465
0

Możesz zrobić coś takiego

Kopiuj
Scanner scanner = new Scanner(idList);
List<Integer> list = new ArrayList<Integer>();
while (scanner.hasNextInt()) {
    list.add(scanner.nextInt());
}

EDIT: To działa jeżeli są oddzielone spacją, dla przecinków możesz albo po prostu zmienić je na spacje albo użyć new Scanner(idList).useDelimiter(",");

AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 143
0

zrobiłem to w takiej pętli

Kopiuj
   List<Integer> result = Lists.newArrayList();
        String[] lista = idList.split(",");
        for (String list : lista) {
            result.add(new Integer(list.trim()));

        }
        return result;

Teraz pozostaje problem że jesli po przecinku jest coś co zaczyna się od litery bądź jest w nim litera, to mam ignorować ten wiersz listy i iść dalej.

caer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 465
0

No to właśnie po to jest nextInt(), tylko musisz zmienić pętlę na coś takiego

Kopiuj
while (scanner.hasNext()) {
    if (scanner.hasNextInt()) {
        list.add(scanner.nextInt());
    } else {
        scanner.next();
    }
}

Możesz to zrobić splitem i użyć Apache Commons albo wyrażenia regularnego do sprawdzenia czy string jest liczbą, albo wrzucić to w try/catch i spróbować sparsować do inta, ale w takim wypadku iterujesz po całym Stringu dwa razy, zamiast tylko raz.

AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 143
0

na tą chwilę zrobiłem tak :

Kopiuj
 public List<Integer> prepareIdsListFormRequest(String idList) {
        List<Integer> result = Lists.newArrayList();
        String[] lista = idList.split(",");
        for (String itemIdAsText : lista) {
            Integer itemId = safeParseInt(itemIdAsText.trim());
            if (itemId == null){
                break;
            }
            result.add(itemId);
        }
        return result;
    }

    private Integer safeParseInt(String itemId) {
        try {
            return Integer.parseInt(itemId);
        } catch (NumberFormatException e) {
            return null;
        }
    }
}

I więc problem exceptiona przy literze jest załatwiony aczkolwiek chce żeby nie dodawał mi tego rekordu zawierającego literę, więc jeśli itemId == null to ma ominąć i iść i dodawać następne

AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 143
0

ach no bo już taki jestem ;p teraz jeszcze zostało pomijanie duplikatów ;p

caer
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 465
0
Altaro napisał(a):

ach no bo już taki jestem ;p teraz jeszcze zostało pomijanie duplikatów ;p

To zamiast listy użyj Seta, ew. po wszystkim konwertując go do listy

AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 143
0

duplikaty pomijam w pętli :

Kopiuj

if (itemId != null && !result.contains(itemId)) {
                    result.add(itemId);
                }


AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 143
0

Ostatnia rzecz do zrobienia została ...

Jak w pętli przekazywać listę result jako pojedynczy itemId do storeItemPremieraDate

Kopiuj
 @Override
	public KADynaBean globalModifyItemData(List<Integer> result, String statusFilter, int status, Integer withdrawCause, UserData userData, Date premiereData) throws Exception {
     

        tradeConditionsBean.storeItemPremieraDate(itemId, premiereData, userData);
        return beanModify.setItemsStatusGlobal(status, result, statusFilter, withdrawCause, userData);
	}

AL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 143
0

hmm Wygląda na to że tak to działa :

Kopiuj
 @Override
	public KADynaBean globalModifyItemData(List<Integer> result, String statusFilter, int status, Integer withdrawCause, UserData userData, Date premiereData) throws Exception {
        for (Integer itemId : result) {
            tradeConditionsBean.storeItemPremieraDate(itemId, premiereData, userData);
        }
        return beanModify.setItemsStatusGlobal(status, result, statusFilter, withdrawCause, userData);
	}
Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

Ta pierwsza funkcja to zwyczajnie:

Kopiuj
        Set<Integer> ints = Arrays.stream(data.split(","))
                .filter(entry -> entry.matches("^\\d+$"))
                .map(Integer::valueOf)
                .collect(Collectors.toSet());

Filtrujesz wszystkie nie-liczby, zamieniasz na inty i zbierasz do seta więc nie ma duplikatów.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.