Split String i wrzucenie do listy

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...

 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.

0

Możesz zrobić coś takiego

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(",");

0

zrobiłem to w takiej pętli

   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.

0

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

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.

0

na tą chwilę zrobiłem tak :

 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

0

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

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

0

duplikaty pomijam w pętli :


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


0

Ostatnia rzecz do zrobienia została ...

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

 @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);
	}

0

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

 @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);
	}
1

Ta pierwsza funkcja to zwyczajnie:

        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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1