pliki, kolekcje - listy

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

    }
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)
0

Jak się używa tego 1?

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

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);
        }
        
        }
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ł?

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

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