Jump to content
Unity Insider Forum

Arrays vergleichen


Kojote

Recommended Posts

Guten Morgen! :)

Ich bastel gerade an einer Lösungsabfrage und habe ein Array mit Integer Zahlen.

Zur Lösung müssen alle Integer Zahlen einen unterschiedlichen Wert haben.

Habe mir mal das zusamen gebaut:

for (int i = 0; i < zahlenArray.Length - 1; ++i) {
    for (int j = i + 1; j < zahlenArray.Length; ++j) {
    	if (zahlenArray[i] != zahlenArray[j]) {
        	Debug.Log("Alle Ungleich - Lösung");
        } else {
			Debug.Log("Gleiche - keine Lösung");
        }  
	}
}

Wenn alle Werte gleich sind, kommt die Meldung, dass es keine Lösung gibt, was auch richtig ist.

Normalerweise sollte nun, sobald alle Ungleich sind, die Lösung ausgerufen werden. Problem ist nun, dass, sobald nur eine Zahl ungleich ist und alle anderen gleich sind, es auch zu einer Lösung kommt. Ich möchte jedoch, dass es nur zu einer Lösung kommt, wenn alle Zahlen ungleich sind.

Habt ihr da eine Idee?

Danke schon mal! :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, es reicht nicht aus, nur die 2 Nachbarn zu vergleichen, denn die gleichen Zahlen können ja an zufälligen Stellen im Array sein.

Du solltest das Array einfach kopieren und bei der Kopie ersteinmal die Zahlen sortieren. Der einfachste Sortieralgorythmus geht so, dass du die 1. Zahl mit der 2. Zahl vergleichst. Ist die 1. Zahl größer als die 2. dann tauschst du sie im Array und fährst nun eine Stelle weiter. Also jetzt die 2. Zahl mit der 3. Zahl vergleichen, ggf. Tauschen oder einfach weiter fahren.
Das Array muss natürlich schon sehr oft durchfahren werden, bis so alle Plätze passen. Wann du fertig bist, erkennst du daran, dass du kein Pärchen mehr tauschen musstest.
Wärend dieser Sortierung bekommst du die Information, ob zwei Zahlen gleich sind, denn du fragst nicht nur > oder < ab, sondern auch noch == .
Sobald zwei Zahlen gleich sind, brichst du ab.
Ist dein Array sortiert, also die letzte Durchfahrt hat keine Zahlen mehr getauscht, dann sind in deinem Array nur unterschiedliche Zahlen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

So ganz mit dem sortieren hab ich das nicht hin bekommen, ich habs nun so probiert und scheint zu funktionieren:

Array.Copy(zahlenArray, loesungsArray, zahlenArray.Length);
        int doppelteInZahlen = 0;
        for (int i = 0; i < zahlenArray.Length - 1; i++) {
            for (int j = i + 1; j < loesungsArray.Length; j++) {
                if (zahlenArray[i] == loesungsArray[j]) {
                    doppelteInZahlen++;
                }
            } 
        }
        Debug.Log(doppelteInZahlen);  

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Über Performance kann ich mich bisher zum Glück nicht beschweren, HortusLonggus. Wie würde das funktionieren? Kenne die Befehle leider nicht. ^^ 

Eventuell hilfst du mir gerade mit den Methoden bei einem neuen Problem:

for (int i = 0; i < zahlenArray.Length - 1; i++) {
            for (int j = i + 1; j < loesungZahlenArray.Length; j++) {
                if (zahlenArray[i] == loesungZahlenArray[j]) {
                    doppelteInZahlen++;
                    if (spielMenue.hilfe == 1) {
                        zahlenTextArray[i].color = new Color32(232, 0, 0, 255);
                        zahlenTextArray[j].color = new Color32(232, 0, 0, 255);
                    }
                        
                } else {
                    if (spielMenue.hilfe == 1) {
                        zahlenTextArray[j].color = new Color32(255, 255, 255, 255);
                    }
                }
            }
        }

Ich möchte gerne, dass alle Zahlen, die doppelt in meinem Array vorkommen farblich markiert werden. Bisher habe ich das Problem, dass entweder zu wenige oder zu viele Zahlen farblich markiert werden.

Wie bekommt man so was hin?

Link zu diesem Kommentar
Auf anderen Seiten teilen

"Kenne ich nicht" soll ja ein Problem sein, das man abstellen kann, habe ich gehört. ;-)

Mal eine Lösung mit FindAll, die dir das erklärt, direkt aus der Microsoft-Hilfe übernommen:

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
      // Get an array of n random integers.
      int[] values = GetArray(50, 0, 1000);
      int lBound = 300;
      int uBound = 600;
      int[] matchedItems = Array.FindAll(values, x =>  
                                       x >= lBound && x <= uBound);  
      for (int ctr = 0; ctr < matchedItems.Length; ctr++) {
         Console.Write("{0}  ", matchedItems[ctr]);
         if ((ctr + 1) % 12 == 0)
            Console.WriteLine();
      }
   }

   private static int[] GetArray(int n, int lower, int upper)
   {
      Random rnd = new Random();
      List<int> list = new List<int>();
      for (int ctr = 1; ctr <= n; ctr++)
         list.Add(rnd.Next(lower, upper + 1));

      return list.ToArray();
   }
}
// The example displays output similar to the following:
//       542  398  356  351  348  301  562  599  575  400  569  306
//       535  416  393  385
Link zu diesem Kommentar
Auf anderen Seiten teilen

Mit den ganzen Find Befehlen kann man natürlich sehr gut Dinge finden, die man sucht. Dafür muss man aber leider vorher das Ding kennen/ definieren.
Und das ist ja genau das Proble hier. Man hat ein Array mit zufälligen Zahlen, wobei evtl. einige doppelt sind. Diese doppelten kennt man aber noch nicht und somit kann ich per Find erstmal nicht sagen, nach was ich überhaupt suche.
Also müsste ich eine Stelle im Array auslesen, und diesen Wert dann im Array wieder mit FindAll suchen. Das müsste ich natürlich mit der nächsten Zahl wiederholen, usw.  Irgendwie sehe ich da jetzt nicht so den Vorteil.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Probier mal so:

for (int i = 0; i < zahlenArray.Length - 1; i++) {
           // Erst einmal alles auf "nicht doppelt" setzen
           if (spielMenue.hilfe == 1) {
               zahlenTextArray[i].color = new Color32(255, 255, 255, 255);
           }
                                      
            for (int j = i + 1; j < loesungZahlenArray.Length; j++) {
                if (zahlenArray[i] == loesungZahlenArray[j]) {
                    // "Doppelte Zahlen" an Stelle i über das Lösungsarray gefunden
                    doppelteInZahlen++;                    
                    if (spielMenue.hilfe == 1) {
                        zahlenTextArray[i].color = new Color32(232, 0, 0, 255);
                    }                        
                }
            }
        }
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 18 Stunden schrieb malzbie:

Mit den ganzen Find Befehlen kann man natürlich sehr gut Dinge finden, die man sucht. Dafür muss man aber leider vorher das Ding kennen/ definieren.
Und das ist ja genau das Proble hier. Man hat ein Array mit zufälligen Zahlen, wobei evtl. einige doppelt sind. Diese doppelten kennt man aber noch nicht und somit kann ich per Find erstmal nicht sagen, nach was ich überhaupt suche.
Also müsste ich eine Stelle im Array auslesen, und diesen Wert dann im Array wieder mit FindAll suchen. Das müsste ich natürlich mit der nächsten Zahl wiederholen, usw.  Irgendwie sehe ich da jetzt nicht so den Vorteil.
 

Na ja, liest du deine eigenen Postings nicht? :-)
Du hast doch in deiner ersten Antwort gleich einen möglichen Ansatz vorgeschlagen; bei dem ist mir allerdings aufgefallen, daß du dabei Sortierverrenkungen machst, die gefühlt schon zu Zuses Zeiten veraltet waren und mehr Basic sind als C#.

Folgt man deinem Ansatz, schiebt man 1.) Kojotes zahlenArray in ein Array.Sort(), das man dann 2.) Array.FindAll() übergibt mit der Bedingung x==x.nachbar; schwupps, fertig.
Das ist ein Zweizeiler. Wo siehst du ein Problem?

Cu, Horst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb HortusLongus:

..., die gefühlt schon zu Zuses Zeiten veraltet waren und mehr Basic sind als C#.

Ja, das ist mein Ursprung! ;) Ich bin kein Informatiker sondern gelernter Elektromechaniker. Basic, Assembler, und Pascal waren die wenigen Dinge, die es damals gab. Alles Andere hab ich mir selber beigebracht und somit sind mir auch nicht alle Möglichkeiten von C, Java oder c# bekannt. Aber ich lerne ja täglich dazu.
Ich habe mich gestern mal mit meinem Sohn über dieses Problem ausgetauscht ( der studiert gerade Informatik) und auch er kam auf den Sort-Befehl (den du übrigens nicht erwähnt hattest) und danach dann das Überprüfen der Nachbarn.
Ich sehe also keine Probleme, sonder hatte lediglich keinen Vorteil gesehen. Aber wie gesgt; ich kenne nicht alle Möglichkeiten, die es in den Programmier- oder Scriptsprachen so gibt. Deswegen erkenne ich auch nicht alle Vorteile und bau mir eben selber etwas zurecht. Ist oftmals Oldscool, funktioniert aber. ;)
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Woher kommt bloß immer dieser völlig unlogische Gedanke, Mods müssten alles besser wissen als jeder andere?

Der Job eines Moderatoren ist, dafür zu sorgen, dass das Forum läuft. Jemand, der noch nie im Leben programmiert hat kann hier durchaus auch Moderator sein, wenn er es möchte.

Ich kriege jedes Mal Blitzherpes, wenn jemand mit so einem Stumpfsinn ankommt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@HortusLongus
Hehe!
Etwas zu moderieren, bedeutet nicht, dass man in dem Themenbereich Meister sein muss. Ich trage die Binde auch nicht wie eine Führugspersönlichkeit sondern als Hinweis, dass ich gewisse Dinge in dem Forum tun kann oder muss, um eine gewisse Ordnung aufrecht zu halten.
Aber alles was ich hier poste, was nicht mit der Organisation des Forums zu tun hat, tue ich als Privatperson.
Deine Ansprüche im Bezug auf den Moderator sind also nicht zu hoch, sondern fehl am Platz. Im Bezug auf mich als Privatperson mag das schon sein, dass ich deinen Ansprüchen nicht genüge. Das macht mir jetzt aber nicht so viel aus, denn ich habe ja nichts falsches gemacht, es war halt nur nicht gut genug für dich.
Dafür kann ich soo viel mehr als nur zu programmieren und deswegen kann ich den Leuten sogar in allen anderen Bereichen der Spieleerstellung mit Unity helfen.
Ich bin sehr zufrieden mit mir. :)
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...