Szukanie ciągu znaków na podstawie wzoru

0

Problem wyglada nastepujaco:

    a[0] = "jakis tekst";
    a[1] = "innt tekst";
    a[2] = "jeszcze inny tekst";

    b[0] = "jakis tekst 123";
    b[1] = "cos innego";
    b[2] = "byle co";
    b[3] = "jeszcze inny tekst - czemu nie";

Chcę porównać każdy element tablicy a z każdym elementem tablicy b, wynikiem powinen byc:

  • jakiś tekst 123 (pasuje!)
  • coś innego
  • byle co
  • jeszcze inny tekst - czemu nie (pasuje!)

Macie jakies optymalnie działające pomysły?

0

użyj pętli dwóch petli for-jedną dla drugą dla b, metody substring z klasy String dla elementów tablic i na końcu jednego ifa.

To jest naprawdę proste - jak dojdziesz samodzielnie do rozwiazania to o wiele lepiej smakuje:-)

0

No wiec działa elegancko

    for(int i=0; i<b.length; i++)
    {
        for(int j=0; j<a.length; j++)
        {
            if(b[i].indexOf(a[j]) != -1)
            {                    
                System.out.println(a[j] + " | " + b[i]);
            }
        }
    }

Teraz pojawił się inny problem, teraz chciałbym żeby wyswietlilo te elementy tablicy, które nie mają "pary", jakies pomysły?

0

Akurat w tym konkretnym przypadku (chodzi o całe rozwiązanie) można by użyć Seta:

Set<String> set = new TreeSet<String>(new Comparator<String>() {
    public int compare(String o1, String o2) {
        return (o2.contains(o1)) ? 0 : 1;
    }
});
set.addAll(Arrays.asList(b));
set.addAll(Arrays.asList(a));

Jeśli ważne jest tylko wypisanie wyniku, przychodzi mi do głowy pewien pomysł, trochę tylko nagmatwany:

List<String> pary = new ArrayList<String>();
List<String> bezPary = new ArrayList<String>();
for (String aString : a) {
    for (String bString : b) {
        if (bString.contains(aString)) {
            pary.add(bString);
            pary.add(aString);
        }
    }
}
bezPary.addAll(Arrays.asList(a));
bezPary.addAll(Arrays.asList(b));
bezPary.removeAll(pary);

for(Iterator iterator = pary.iterator(); iterator.hasNext();) {
    System.out.println(iterator.next() + " | " + iterator.next());
}
for(String string : bezPary) {
    System.out.println(string);
}
0

@orl

Bardzo ładnie tylko w ten Twój if nie do końca tak działa jak ma.
On sprawdza czy dany index w elemencie tablicy a istnieje w tablicy b.

Ten Twój if przejdzie równiez takie coś:

a[1] = "123456"
b[3] = "abcdef";

Musisz użyć substring który działa na zasadzie rozbijania na łańcuchy;

Jeżeli masz Stringa "abcdefg" to substring(0,3) da Ci nowy String "abc".
Wydłuzajac w pętli ten "podłańcuch" będziesz w stanie porównac ciągi.
A potem już tylko dasz else i w nich bedziesz wyświetlał te które nie maja odpowiednika.

PS: Ten index który teraz masz zostaw - bedzie sprawdzal czy porownujac nie wyjdziesz za tabele.

0

Zauważ, że poprzez zwykły else Stringi nieposiadające odpowiednika wypiszą się po kilka razy (na każdą pętlę), wypiszą się też te, które posiadają odpowiednik, ale w danej iteracji nie spełnią warunku (po prostu wszystkie się wtedy wypiszą).
Co do indexOf - on zwraca indeks, od którego zaczyna się String przekazany przez argument (-1, jeśli taki podciąg nie istnieje).

0

Moze być ?

 for (int i = 0; i < a.length; i++) {
            boolean odpowiednik = false;
            for (int j = 0; j < b.length; j++) {
                if (a[i].indexOf(b[j]) != -1) {
                    for (int pozycja = 0; pozycja < a[i].length(); pozycja++) {
                        if (a[i].substring(0, pozycja + 1).equals(b[j].substring(0, pozycja + 1))) {
                            odpowiednik = true;
                        } else {
                            odpowiednik = false;
                            break;
                        }
                    }
                } else {
                    odpowiednik = false;
                }
                if (odpowiednik == true) {
                    System.out.println(a[i] + " odpowiada " + b[j]);
                }
            }
            if (odpowiednik == false) {

                System.out.println("Bez odpowiednika " + a[i]);
            }

        }
0

@lipkerson
Ten twój kod jakoś mi nie działa poprawnie

0
lipkerson napisał(a)

@orl

Ten Twój if przejdzie równiez takie coś:

a[1] = "123456"
b[3] = "abcdef";

Nie przejdzie ;>

0

ok, małe przeoczenie - w pracy siedze i tez robie takie pierdołki i mnie się już Stringi po oczach przesuwają

  String a[] = new String[3]    ;
    String b[] = new String[4]    ;

        a[0] = "jakis tekst";
        a[1] = "innt tekst";
        a[2] = "jeszcze inny tekst";

        b[0] = "jakis tekst 123";
        b[1] = "cos innego";
        b[2] = "byle co";
        b[3] = "jeszcze inny tekst - czemu nie";


        for (int i = 0; i < a.length; i++) {
            boolean odpowiednik = false;
            boolean znaleziono = false;
            for (int j = 0; j < b.length; j++) {
                   odpowiednik = false;
                if (b[j].indexOf(a[i]) != -1) {
                    for (int pozycja = 0; pozycja < a[i].length(); pozycja++) {
                        if (a[i].substring(0, pozycja + 1).equals(b[j].substring(0, pozycja + 1))) {
                            odpowiednik = true;
                        } else {
                            odpowiednik = false;
                            break;
                        }
                    }
                } 
                    
                
                if (odpowiednik == true) {
                    System.out.println(a[i] + " odpowiada " + b[j]);
                    znaleziono = true;
                }
            }
            if (odpowiednik == false && znaleziono == false)
            {

                System.out.println("Bez odpowiednika " + a[i]);
            }

        }
0

Ok, wielkie dzięki za poświęcony czas :)

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