ubuntuusers.de

Java Kleiner-Relation zweier Arrays

Status: Ungelöst | Ubuntu-Version: Kein Ubuntu
Antworten |

VicariousVirus

Avatar von VicariousVirus

Anmeldungsdatum:
7. Mai 2011

Beiträge: 27

Wohnort: Berlin

Hey, ich hab mal wieder eine Frage: Ichb will zwei Arrays auf die Relation vergleichen, ob a kleiner ist. Dabei ist der Array in der Größenordnung, als wäre er ein BigInteger (die Aufgabe ist in etwa die Methoden zu schreiben, als wenn es keine API BigInt geben würde). Für den Fall das eines Stellenmäßig größer ist hab ich schon eine Lösung. Für den Fall, dass beide Array gleich lang sind wollte ich wie folgt vorgehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
....
 else {
                for(int i =a.length-1;i>=0;i--){
                    if(a[i] < b[i] && a[i] != 0 && b[i] != 0){
                        lessRelation = true;
	                break;
                    }
                    else{
		        lessRelation = false;
                    }
                }
....

Der spannende Teil ist im if-Bereich, ich wollte schauen, ob die Elemente von a[i] kleiner sind als b[i] sind. Allerdings kann der Array auch Nullen haben, was mich gerade verwirrt. Die müssten aber ignoriert werden.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Was genau ist jetzt die Frage? Kommst du mit auftretenden Nullen nicht klar, oder worin besteht dein konkretes Problem?

VicariousVirus

(Themenstarter)
Avatar von VicariousVirus

Anmeldungsdatum:
7. Mai 2011

Beiträge: 27

Wohnort: Berlin

Ich weiß nicht, wie ich die Nullen im beim if sozusagen ignorieren soll. Also das an den Stellen wo a[i] und b[i] null ist soll er nicht abbrechen, da die beiden gleich groß wären, die sollen einfach nicht beachten werden.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

VicariousVirus schrieb:

Ich weiß nicht, wie ich die Nullen im beim if sozusagen ignorieren soll. Also das an den Stellen wo a[i] und b[i] null ist soll er nicht abbrechen, da die beiden gleich groß wären, die sollen einfach nicht beachten werden.

Redest Du speziell von führenden Nullen? Es macht doch keinen Unterschied ob ich

2662 vs 2752 vergleiche oder
0660 vs 0750 

VicariousVirus

(Themenstarter)
Avatar von VicariousVirus

Anmeldungsdatum:
7. Mai 2011

Beiträge: 27

Wohnort: Berlin

Nein keine führenden Nullen, die sind schon elimeniert worden. Es geht nur noch darum, wenn der Array die gleiche Länge hat, wollte ich schrittweise durchgehen und von der höchsten Stelle schauen, ob a kleiner als b ist. Deswegen auch der for Teil mit dem if, wenn dann aber an einer Stelle a und b = 0 sind müsste die ja übersprungen werden. Falls a größer b ist soll false zurückgeliefert werden und die for-Schleife abgebrochen werden.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Und wenn a und b == 2 sind? Was ist der Unterschied zu 0?

pascoli

Anmeldungsdatum:
5. Mai 2008

Beiträge: 124

Wie wär's mit

1
2
if ( a[i] == 0 && b[i] == 0 )
  continue;

als erste Anweisung im for-Block.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

pascoli schrieb:

Wie wär's mit

1
2
if ( a[i] == 0 && b[i] == 0 )
  continue;

als erste Anweisung im for-Block.

Kannst Du erklären was am Fall ((a == b) == c) besonders ist für den Fall das c := 0?

pascoli

Anmeldungsdatum:
5. Mai 2008

Beiträge: 124

Nun, es sollte nur Null ignoriert werden, nicht aber a == b und a != 0. Ich weiß ja nicht, was da sonst noch an Code im else-Zweig "weggekürzt" wurde. := Pascal läßt grüßen ☺

VicariousVirus

(Themenstarter)
Avatar von VicariousVirus

Anmeldungsdatum:
7. Mai 2011

Beiträge: 27

Wohnort: Berlin

Naja, für den Fall, dass a == b sein sollte ist die Relation doch schon eindeutig, dann ist a nicht kleiner b.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	static boolean less (int[ ] a, int[ ] b)
	{
	    boolean lessRelation = false;
	    if(a.length != b.length){
		if(a.length >= b.length)
		    lessRelation = false;
		else
		    lessRelation = true;
	    }
	    else {
		for(int i =a.length-1;i>=0;i--){
		    if(a[i] >= b[i]){
			lessRelation = false;
			break;
		    }
		    else{
			lessRelation = true;
		    }
		}
	    }
	    return lessRelation;
	}
	

So sieht die Methode momentan aus.

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Aus dem a.length >= b.length kannst du übrigens problemlos ein a.length > b.length machen. Einerseits ist dann klarer, was du möchtest. Und andererseits wurde durch das vorherige Testen auf a.length != b.length ja bereits die Gleichheit ausgeschlossen. Das wird der Compiler sicherlich schon von sich aus wegoptimieren und es hat so oder so keine ernsten Auswirkungen auf die Laufzeit, aber darum geht es hier IMHO auch nicht.

pascoli

Anmeldungsdatum:
5. Mai 2008

Beiträge: 124

Ist das Problem jetzt gelöst? Beim ersten a[i] == b[i] wird lessRelation == false und die Schleife beendet. Wird in der Schleife auf a[i] > b[i] getestet und gilt für alle i a[i] == b[i] ist am Ende lessRelation == true. Soll das alles so sein?

elostio

Avatar von elostio

Anmeldungsdatum:
2. Februar 2006

Beiträge: 424

Wohnort: Guayaquil

so würds ich schreiben:

1
2
3
4
5
6
7
8
9
	static boolean less (int[ ] a, int[ ] b) {
	    if(a.length != b.length){
                return (a.length < b.length);
	    }
            for(int i =a.length-1;i>=0;i--) {
                if (a[i] != b[i]) { return a[i] < b[i]; }              
            }
            return false; // a == b
        }

edit: was noch interessant ist, wo sind denn im Array die höchsten Stellen zu finden? Im Moment gehen wir von "rechts" aus.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13207

elostio schrieb:

edit: was noch interessant ist, wo sind denn im Array die höchsten Stellen zu finden? Im Moment gehen wir von "rechts" aus.

Wo ist bei Dir "rechts"? Eine Angabe welchen Index Du meinst, wäre weniger fehlerträchtig. 😉

Ja, es wäre schon wichtig zu wissen, wie die Eingabedaten aussehen und wie das Ergebnis aussehen soll.

Im Übrigen kann man nicht die Länge nehmen, denn man weiß nicht, ob die führenden Stellen Nullen enthalten oder nicht. Falls das nicht als Eingabe zugelassen ist, würde ich das auf jeden Fall prüfen und andernfalls eine Exception werfen.

Ciao

robert

elostio

Avatar von elostio

Anmeldungsdatum:
2. Februar 2006

Beiträge: 424

Wohnort: Guayaquil

rklm schrieb:

Wo ist bei Dir "rechts"? Eine Angabe welchen Index Du meinst, wäre weniger fehlerträchtig. 😉

Ja hast natürlich recht, ich wollte die Bezeichung Big bzw. Little Endian verwenden, dachte aber so wäre es einfacher. ☺

rklm schrieb:

Im Übrigen kann man nicht die Länge nehmen, denn man weiß nicht, ob die führenden Stellen Nullen enthalten oder nicht. Falls das nicht als Eingabe zugelassen ist, würde ich das auf jeden Fall prüfen und andernfalls eine Exception werfen.

VicariousVirus schrieb:

Nein keine führenden Nullen, die sind schon elimeniert worden.

Antworten |