Porównywanie wielu stringów

0

Witam,

Na wstępie zaznaczę, że dopiero zaczynam naukę Javy i to o co proszę może okazać się głupie, jednak zaryzykuję :P Tworzę kod, w którym fragment polega na odczytaniu a później rozbiciu stringów na pojedyncze komponenty:

// Odczytywanie pól "liczb"
		
		EqOne = tEqOne.getText();
		EqTwo = tEqTwo.getText();
		EqThree = tEqThree.getText();
		EqFour = tEqFour.getText();
		EqFive = tEqFive.getText();
		EqSix = tEqSix.getText();
		EqFinal = tEqFinal.getText();
		
		// Rozdzielenie "liczb" na "cyfry"
		
		String[] comp1 = EqOne.split("");
		String[] comp2 = EqTwo.split("");
		String[] comp3 = EqThree.split("");
		String[] comp4 = EqFour.split("");
		String[] comp5 = EqFive.split("");
		String[] comp6 = EqSix.split("");
		String[] compFinal = EqFinal.split(""); 

Stringi 1-6 mogą się składać maksymalnie z 6 znaków, 7 (Final) maksymalnie 7 znaków.

1 Pomysł:

Czy istnieje metoda, która porówna wszystkie te komponenty i przypisze jednakowym nową zmienną (maksymalnie będzie istnieć 10 zmiennych), którą będę mógł wywołać używając dalej fragmenty stringów comp?

Czyli przykładowo:

string 1: XYZ
string 2: YZX
string 3: ZXY
string final: VXZY

Jak widać od razu: comp1[2]=comp2[1]=comp3[0]=compFinal[1] -> string zmiennaZ?

Stringi będą zamieniane później na int do obliczeń, jeśli to jakoś zmienia sytuację ;)

2 Pomysł:

Druga opcja polegałaby na stworzeniu wcześniej tablicy z 26 zmiennymi. Kod sprawdzałby, które z nich są użyte w stringach i wykorzystaniu tylko tych do dalszych obliczeń. W tym przypadku również istniałoby maksymalnie 10 zmiennych i również "comp będą użyte w dalszej części programu jako int" ;P

Pozdrawiam serdecznie i liczę na dużo cierpliwości czytając moje głupoty :D

0

nie ogarniam, można jaśniej ?

0

Na wstępie zaznaczę, że dopiero zaczynam naukę Javy i to o co proszę może okazać się głupie, jednak zaryzykuję

No, brzmi to całkiem głupio. Może po prostu powiedz na czym polega problem (ten, który próbujesz rozwiązać tym kodem, a nie to czego nie umiesz zaimplementować), a nie swoją próbę rozwiązania? Tak będzie prościej, szybciej, lepiej.

0

Jak porównać wiele stringów i przypisać tym samym nową zmienną typu int? :P Bo wiem, że musiałbym napisać dużo If/while/equals itd, ale może jest jakiś szybszy i pewniejszy sposób?

0
nz napisał(a):

na czym polega problem (ten, który próbujesz rozwiązać tym kodem, a nie to czego nie umiesz zaimplementować), a nie swoją próbę rozwiązania? Tak będzie prościej, szybciej, lepiej.

Staram się napisać solver, do łamigłówki matematycznej. Jeden z jej elementów polega na dopasowaniu odpowiednich cyfr do liter tak aby działanie matematyczne się zgadzało.

Obecnie mam napisany fragment, który odczytuje poszczególne "liczby" i rozbija je na "cyfry", jednak wszystkie one są poukrywane pod literami i potrzebuję coś co porówna wszystkie te fragmenty ze sobą i przypisze im jakiś nowy string. W dalszej części będę chciał stworzyć coś co dopasuje cyfry do liter (nowych stringów), i tak aby równania się zgadzały i wypluje odpowiedź np: A = 0, B = 4, C = 7, D = 5.

1

Masz rację, piszesz na razie głupoty.
Wziąłeś trochę za duży problem jak na swój poziom wiedzy.
Spróbuj czegoś prostszego, ew. przeczytaj jakąś książkę (wystarczy jedna) dot. podstaw Javy.

http://helion.pl/ksiazki/java-przewodnik-dla-poczatkujacych-wydanie-vi-herbert-schildt,javpp6.htm
http://helion.pl/ksiazki/java-rusz-glowa-wydanie-ii-kathy-sierra-bert-bates,javrg2.htm
http://helion.pl/ksiazki/java-podstawy-wydanie-ix-cay-s-horstmann-gary-cornell,javpd9.htm

Tu masz opisanych kilka pierwszych kroków w nauce:
http://www.foundbit.com/pl/zasoby/jezyki/java/articles/java-kroki.html

0

Dzięki, czytam już Horstmanna ;) Wiem, że ten program może być zbyt trudny jak na moje umiejętności, ale trzeba stawiać sobie wyższe wyzwania :P

Dam może bardziej jasny przykład zadania:

| L | Z | G | Z | Z | I
| L | L | I | S | I | K
| K | G | K | L | Z | S
| Z | Z | Z | K | Z | G

  • | Z | I | S | G | L | G
    L | G | I | L | I | S | I
    Litery, które występują w równaniu: G, I, K, L, S, Z. Cel zadania: dopasowanie tak cyfr 0-9 (bez powtórzeń), aby powyższe równanie się zgadzało.

To co obecnie mam: program interface oraz odczytanie linijek. Co potrzebuję: jak dopasować literki, żeby nie istotne jakie się pojawią program liczył :P Czyli np program wie, że jest 6 liter (w.w.) i nazywa je np. Num1, Num2,...,Num6. Jeśli pojawią się inne lub więcej to i tak dopasuje odpowiednikom Num1, Num2,...,NumX ;]

Pozdrawiam!

1

Według mnie to nie jest zadanie na javę, tylko algorytmiczne.
Trzeba tu zapewne użyć jakieś sprytnej struktury danych, inaczej trzeba by użyć pętli wielokrotnie zagnieżdżonych, co jest w złym stylu i bez sensu.
Zdecydowanie dla osób sprawnych algorytmicznie, może w dziale algorytmicznym poproś o wskazówki, bo przeciętny javowiec ci nie pomoże.

0

Według mnie pokombinuj trochę z ASCII. Litery potraktuj jako znaki i odejmij od nich 97 (bo tyle ma wartość 'a'), potem może na coś wpadniesz. Oprócz tego jeśli chodzi o "dopasowania" w samej javie no to nasuwa się struktura mapy

1

Chwila chwila. Czy ja dobrze rozumiem?
Masz zbiór stringów i chcesz bijektywnie odwzorować te stringi na liczby, tj każdego takiemu samemu stringowi chcesz przyporządkować liczbę tak, żeby dwa różne stringi miały inne liczby. Tak?
Przykład:
"ala" -> 1
"ma" -> 2
"ma" -> 2
"ala" -> 1
"kota" -> 3

0

Mniej więcej tak ;) Stringi to pojedyncze litery, a liczby będą musiały się dopasowywać - nie mogą być z góry narzucone (tutaj chcę użyć Math.random()*10 z odpowiednimi ograniczeniami i równaniami).

Na początku napisałem taki właśnie kod do rozwiązywani:

public class Solverpt4
{
	public static void main (String [] args){
		
		int SumK1 = 10000000;
		int SumK2 = 10000000;
	
		do {
			
		int[] nums = new int[11];
		
		for (int i =1; i<=10; i++){
			nums[i] = i;
		}
		
		for (int i = 1; i<10; i++){
			int r = (int) (Math.random()*10);
			int temp = nums[i];
			nums[i] = nums[r];
			nums[r]=temp;
		
		}
		
		int NumE = nums[0];
		int NumI = nums[1];
		int NumL = nums[2];
		int NumM = nums[3];
		int NumP = nums[4];
		int NumS = nums[5];

		
		SumK1 = NumL*1000000+NumE*100000+NumL*10000+NumS*1000+NumS*100+NumE*10+NumS;
		
		int Sum1 = NumL*100000+NumP*10000+NumP*1000+NumS*100+NumS*10+NumM;
		int Sum2 = NumI*100000+NumS*10000+NumM*1000+NumI*100+NumL*10+NumS;
		int Sum3 = NumE*100000+NumI*10000+NumL*1000+NumL*100+NumP*10+NumI;
		int Sum4 = NumE*100000+NumM*10000+NumE*1000+NumI*100+NumI*10+NumP;
		int Sum5 = NumE*100000+NumI*10000+NumS*1000+NumP*100+NumM*10+NumI;
		
		SumK2 = Sum1+Sum2+Sum3+Sum4+Sum5;
		
		
		
		if (SumK1 == SumK2){
		
			System.out.println("SumK1 = " +SumK1);
			System.out.println("SumK2 = "+SumK2);
			System.out.println("A " + NumE);
			System.out.println("F " + NumI);
			System.out.println("J " + NumL);
			System.out.println("N " + NumM);
			System.out.println("O " + NumP);
			System.out.println("X " + NumS);
		 }
		}
		while (SumK1!=SumK2);
		
		
	}
}

Potem stwierdziłem, że nie mogę za każdym razem zmieniać kodu, i zacząłem pisać ten projekcik :P Mam w głowie wszystko co potrzebuję, tylko utknąłem własnie na etapie zamiany stringów :]

0

https://pl.wikipedia.org/wiki/Funkcja_skr%C3%B3tu
http://ideone.com/f42kg5
edit: to chyba jednak nie jest rozwiązanie problemu.

0

Ok, wymyśliłem częściowe rozwiązanie problemu:

Stworzę 10 pól, w których będzie można umieścić Litery (czyli zmienne). Program przypisuje teraz, że np. zmienna 1 = A, 2 = B, 3 = C, itd - czyli rodzaj literki będzie obojętny:

Solver1.0.png

Teraz jak sprawić, program przypisywał odpowiednie elementy:

		String[] comp1 = EqOne.split("");
		String[] comp2 = EqTwo.split("");
		String[] comp3 = EqThree.split("");
		String[] comp4 = EqFour.split("");
		String[] comp5 = EqFive.split("");
		String[] comp6 = EqSix.split("");
		String[] compFinal = EqFinal.split("");

czy zwykłe:

		if (comp1[1].equals(sOne)){
			comp1[1] = sOne;
		}
		else if 

Będzie do tego się nadawało? (tutaj wychodziłoby ponad 400 ifów :P), czy może while/switch?

Pozdrawiam!

0

Nie nadaje się. Nie do końca też rozumiem ale nie może być np:

int[] tab = new tab[91];
Random rand = new Random();
tab[Character.toUperCase(pole.getString().toCharArray().charAt(0))] = rand.nextInt(10000);

Pisane z głowy mogą być błędy ewentualnie zastosować shuffle

0

Ok, rozwiązałem wszystkie problemy, poza jednym... losowe liczby :P

do {
	
int[] nums = new int[10];

for (int i =1; i<10; i++){
	nums[i] = i;
}

for (int i = 1; i<10; i++){
	int r = (int) (Math.random()*10);
	int temp = nums[i];
	nums[i] = nums[r];
	nums[r]=temp;

}

zOne = nums[0];
zTwo = nums[1];
zThree = nums[2];
zFour = nums[3];
		
		
		zSum1 = a41*10000+a42*1000+a43*100+a44*10+a45;
		
		zEqOne = a11*1000+a12*100+a13*10+a14;
		zEqTwo = a21*1000+a22*100+a23*10+a24;
		zEqThree = a31*1000+a32*100+a33*10+a34;

		zSum2 = zEqOne+zEqTwo+zEqThree;
		
	
		
		if (zSum1 == zSum2){
			toOne.setText(Integer.toString(zOne));
			toTwo.setText(Integer.toString(zTwo));
			toThree.setText(Integer.toString(zThree));
			toFour.setText(Integer.toString(zFour));	
		}
		}
	while (zSum1 !=zSum2);
	

Czy, ktoś mógłby mi sprawdzić czy wszystko jest ok w tym kodzie? Zmienne a41, a42, a43, itd są przypisane do zOne, zTwo, zThree i zFour do których ma być losowo dobierana liczba 0-9 bez powtórzeń. Bo jeśli tu jest OK, to gdzieś przy przypisywaniu własnie zOne, zTwo, itd do a41, a42,... popełniłem błąd :P

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