pliki, kolekcje - listy

Odpowiedz Nowy wątek
2019-06-09 20:47
0

W pliku tekstowym mam zapisane hasla(kazde w nowym wierszu) w formacie alfanumerycznym, wczytuje najpierw plik tekstowy i chce zapisać hasła do listy ale tylko te które są w postaci numerycznej i sprawdzić ile jest takich haseł. Wytłumaczy ktoś jak to zrobić?

public static void load_passwd(ArrayList<String> list ) throws IOException {
        // write your code here

        String s;
        FileReader file = new FileReader("hasla.txt");
        Scanner plik = new Scanner(file);
       // ArrayList<String>list = new ArrayList<>();
        /* W tym wypadku pętla się wykonuje dopóki trafia na dowolną wartość */
        while(plik.hasNext()) {
            s= plik.next();
            list.add(s);
        }
        for (String el :list) System.out.println(el); // wyswietla liste hasel z pliku

    }
edytowany 1x, ostatnio: Piotr cezary, 2019-06-09 20:50

Pozostało 580 znaków

2019-06-09 20:52
0
  1. Dodajesz do projektu jara od apachea: commons-lang i używasz StringUtils.isAlphanumeric(String)
  2. Bawisz się samemu w regexy (poczytaj :) ) i używasz string.matches( tutaj twoj regex)

Pozostało 580 znaków

2019-06-09 21:28
0

Jak się używa tego 1?

Przecież Ci napisałem jaką metodę masz użyć. - kixe52 2019-06-09 21:33
@Piotr cezary: musisz dokładniej opisywać problem. Ale co użyć? Metodę? Jar? - kixe52 2019-06-09 21:48

Pozostało 580 znaków

2019-06-10 01:28
1

O to chodziło?

class Main
{
    public static boolean isAlphaNumeric(String s) {
        return s != null && s != "" && s.matches("^[a-zA-Z0-9]*$");
    }

    public static boolean isNumeric(String s) { 
        return s != null && s != "" && s.matches("^[0-9]*$");
    }

    public static void main(String[] args) {
        String s = "1234";
        System.out.println("IsAlphaNumeric: " + isAlphaNumeric(s));
        System.out.println("IsAlphaNumeric: " + isNumeric(s));
    }
}

"Jestem nadzieją umęczonych. Jestem śmiercią. Jam jest jerzyk."

Pozostało 580 znaków

2019-06-10 11:48
cs
1

Możesz testować takimi metodami, szczególnie jeśli chcesz rozpoznawać znaki spoza alfabetu łacińskiego:

public boolean isAlphanumeric(String input){
    return input.codePoints().filter(ch -> !Character.isLetterOrDigit(ch)).count() == 0;
  }

public boolean isNumeric(String input){
    return input.codePoints().filter(ch -> !Character.isDigit(ch)).count() == 0;
  }
Odpowiedniejsze chyba byłoby wykorzystanie anyMatch(), allMatch() lub noneMatch() zamiast count(), żeby bez sensu nie zliczać znaków, które nie pasują, bo ich liczba nas nie interesuje. - catom 2019-06-10 14:06

Pozostało 580 znaków

2019-06-10 14:30
1

Jeśli interesują Cię tylko hasła numeryczne, skorzystałbym z podpowiedzi @cs, by wykorzystać metodę Character.isDigit().

Zakładając, że każde hasło w Twoim pliku znajduje się w nowej linii możesz skorzystać od razu z metody Files.lines():

long countNumericPasswords(String filePath) throws IOException {
    return Files.lines(new File(filePath).toPath())    // wczytanie kolejnych linii pliku
        .filter(pass -> pass.codePoints().allMatch(Character::isDigit))  // odfiltrowanie tylko tych, które w 100% składają się z cyfr
        .count(); // obliczenie liczby elementów w Streamie
}

Ew. zakładając, że Twoje hasła są oddzielone białymi znakami, należałoby wykonać jeszcze jeden krok:

long countNumericPasswords(String filePath) throws IOException {
    return Files.lines(new File(filePath).toPath())  // wczytanie kolejnych linii pliku
        .flatMap(str -> Stream.of(str.split("\\s")))     // podział linii na ciągi znaków oddzielone białym znakiem (regex "\s") - transformacja Streama na te łańcuchy znaków po podziale
        .filter(pass -> pass.codePoints().allMatch(Character::isDigit))  // odfiltrowanie tylko tych, które w 100% składają się z cyfr
        .count(); // obliczenie liczby elementów w Streamie
}

W obu powyższych wypadkach skorzystałem z metody Files.lines(Path), która doczytuje kolejne linijki pliku, zamiast wczytywać go od razu w całości - pozwoli to na ograniczenie wykorzystywanych zasobów do odczytu pliku - w przeciwieństwie do np. metody Files.readAllLines(Path).

Pozostało 580 znaków

2019-06-12 17:44
0

Pojawił się jeszcze inny problem. Chciałbym dodać liczbę haseł do listy i problem jest w tym, że lista jest stringiem i to powoduje, że nie mogę użyć pętli for ( int ile= 0; i<ile;i++). W jaki sposób mogę zapisać to inaczej?

public static void add_passwd(ArrayList<String> list ) throws IOException{
        Scanner scanner = new Scanner(System.in);
        System.out.println("Ile hasel dodac: ");
        String ile = scanner.next();
        for(String ile: ){
            System.out.println("Dodaj nowe haslo:");
            String haslo = scanner.next();
            list.add(haslo);

        }
        for(String el: list)
        {
            System.out.println(el);
        }

        }

Pozostało 580 znaków

2019-06-12 17:48
0

Lista jest stringiem? :D

Chciałbym dodać liczbę haseł do listy

Tego też nie rozumiem. W sensie jak pobierzesz od usera liczbę 5 to chcesz dodać 5 haseł?

edytowany 1x, ostatnio: kixe52, 2019-06-12 17:48
W sumie źle się wyraziłem, chciałbym aby użytkownik podał ile haseł chciałby wprowadzić do listy, wtedy pętla z dodawaniem haseł ma się wykonać n razy.Czyli jeśli użytkownik wpisze 5 to mogę dodać 5 haseł. W sumie nie jest stringiem tylko tablicą :D - Piotr cezary 2019-06-12 17:50

Pozostało 580 znaków

2019-06-12 17:54
0
Piotr cezary napisał(a):

W sumie źle się wyraziłem, chciałbym aby użytkownik podał ile haseł chciałby wprowadzić do listy. W sumie nie jest stringiem tylko tablicą :D

  1. PObierasz od usera liczbę, parsujesz to na inta.
  2. Robisz for od 0 do i<liczba
  3. list.add("hasło")

Nie musisz robić fora po ArrayList aby coś do niej dodać.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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