2016-11-23 4 views
3

Hallo ich versuche, einen Benutzer zu einer Liste von Wörtern zu bekommen. Der nächste Schritt besteht darin, dass der Benutzer erneut eines der Wörter eintippt. Anschließend sucht das Programm nach Anagrammen in der Liste. Ich habe einen Weg gefunden, es zu lösen, aber NUR, wenn ich meine eigene Liste überprüfe. Ich würde gerne wissen, wie ich das mache, was ich brauche. keine Notwendigkeit für genauen Code und nur ein wenig Hilfe auf dem Weg. Immer noch neu bei C# und Codierung. Kümmern Sie sich nicht um die schwedischen Kommentare.So registrieren Sie eine Benutzereingabe in eine Liste C#

static void Main(string[] args) 
    { 
     Console.WriteLine("Skriv lite olika ord:"); 
     string[] words = Console.ReadLine().Split(null); 
     Console.WriteLine("Tackar! Välj ett av orden för att kolla ifall det finns Anagram ordet:"); 
     string[] word = Console.ReadLine().Split(null); 

     List<string> result = new List<string>(); 
     bool match = false; 


     for (int i = 0; i < words.Length; i++) 
      words[i] = words[i].Trim(); 

     //Loopar igenom alla ord i arrayen, börjar med första ordet. 
     for (int i = 0; i < words.Length - 1; i++) 
     { 
      result.Add(words[i]); 
      //Loopar igenom arrays med nästkommande ord. 
      for (int c = 2; c < words.Length; c++) 
      { 
       //Gämför bara ifall orden har lika många bokstäver och struntar i "tomma" ord 
       if(words[i].Length == words[c].Length && words[i] !="") 
       { 
        //Konverterar orden till CharArray 
        char[] a = words[i].ToUpper().ToCharArray(); 
        char[] b = words[c].ToUpper().ToCharArray(); 
        //Soreterar orden i bokstavsordning 
        Array.Sort(a); 
        Array.Sort(b); 

        match = false; 
        //sätter en counter för att kunna räkna 
        int counter = 0; 
        //Loppar igen alla bokstäver i orden man jämför 
        // Om den hittar någon bokstav som inte stämmer överens så returners False. 
        // Om alla bokstäver mathar så return true. 
        foreach(char x in a) 
        { 
         if (x == b[counter]) 
          match = true; 
         else 
         { 
          match = false; 
          break; 
         } 
         counter++; 
        } 
        // om alla bokstäver "matchar" så läggs de till i listan 
        // har words[c] = ""; ifall den hittar tomma strings 
        if(match) 
        { 
         result.Add(words[c]); 
         words[c] = ""; 
        } 
       } 
      } 
      // om listan bara blir 1 ord så hittas ingen match 
      if (result.Count() > 1 && result[0] != "") 
      { 
       Console.Write("Anagrams: "); 
       foreach (string s in result) 
        Console.Write(s + " "); 
       Console.WriteLine(); 
      } 
      //återställer listan 
      result.Clear(); 
     } 
     Console.ReadKey(); 
+0

Wenn Sie wollen, dass der Benutzer ein Wort eingeben Sie Console.ReadLine nur anrufen können. Ich schlage vor, dass Sie nach einer leeren Zeichenfolge suchen, um das Programm zu beenden. Übrigens benutze words.Length anstatt words.Count() – bikeman868

Antwort

1

Die Lösung ist eigentlich ganz einfach.
Sie müssen nur jedes Wort überprüfen, das der Anzahl der Buchstaben entspricht, wenn sie die gleichen Buchstaben haben.

z. word hat 4 Buchstaben. Wenn ein Benutzer what eingibt, der 5 Buchstaben hat, können sie nicht übereinstimmen. Aber wenn er darn eintippt, was auch 4 ist, muss man nur prüfen, ob alle Buchstaben übereinstimmen.

Man sollte die Case-Sensitivität im Auge behalten, die ich weggelassen habe, um die Antwort einfacher zu machen.
Neben gibt es zahlreiche Möglichkeiten, um diesen Code zu verbessern, die ich ausgelassen. im Namen der Einfachheit All :)

static void Main(string[] param) 
    { 
     //The list of Words which are anagrams 
     List<string> solutions = new List<string>(); 

     //get the user input 
     string userInput = "User writes arm ram kola like hi"; //Replace with Console.ReadLine().ToLower(); and don't forget to prompt the userwith input 

     //split it into the diffrent words 
     string[] words = userInput.Split(' '); 

     //get the users "match want" 
     string userMatchWant = "mar"; //Replace with Console.ReadLine().ToLower(); and don't forget to prompt the userwith input 

     //Find words wich are as long as mar 
     foreach (string word in words) 
     { 
      //if they arn't the same length it can't be an anagramm 
      if (word.Length != userMatchWant.Length) 
       continue; 

      //To Determin if all characters of the words are the same 
      bool hasOnlyTheSameLetters = false; 

      //now check if all characters contains 
      foreach (char c in word) 
      { 
       //If The lette is in the word assume it contains only of the letters that we are looking for, because 
       if (userMatchWant.Contains(c.ToString())) 
        hasOnlyTheSameLetters = true; 
       //else we know it has a different word so we can breack and check the other input words. 
       else 
       { 
        hasOnlyTheSameLetters = false; 
        break; 
       }       
      } 

      //if there is a diffrence in letters contine 
      if (hasOnlyTheSameLetters == false) 
       continue; 
      //else add the word to the solution 
      else 
       solutions.Add(word); 
     } 

     //Print the solutions 
     if(solutions.Count > 0) 
     { 
      Console.Write("Anagrams: "); 
      foreach (string s in solutions) 
       Console.Write(s + " "); 
      Console.WriteLine(); 
     } 

     Console.ReadKey(); 
    } 

Für all LINQ-Fanatiker gibt, dann ist dies der kürzeste Weg ich tun konnte, das foreach (string Wort in Worten) zu ersetzen - Loop:
var totalMatches = words.Where(p => p.Length == userMatchWant.Length).Where(p => p.All(c => userMatchWant.Contains(c.ToString())));

2

Ihre Frage ist nicht ganz klar, aber ich vermute, Sie suchen Console.ReadLine() und string.Split(), kombiniert wie:

string[] words = Console.ReadLine().Split(null); 

, die alle Teil durch Leerzeichen getrennt zurück.

Es gibt andere Formen von string.Split sollten Sie erforschen, wo Sie welche Zeichen zu spalten durch und entfernen Sie leere Einträge aus dem Ergebnis

+0

Es gibt keine Überladung von ['Split'] (https://msdn.microsoft.com/en-us/library/b873y76a (v = vs.110) .aspx), die null Argumente – Jamiec

+0

@Jamiec Dank nimmt. Ich habe die fehlende Null eingefügt. –

+0

Danke! Das löst einen Teil meines Problems. Man bleibt noch. Die Anagramm-Überprüfung sollte nicht direkt nach der Liste angezeigt werden. Ich möchte, dass der Benutzer eines der Wörter schreibt, die er gerade in die Liste geschrieben hat, und dann sollte das Programm prüfen, ob das letzte Wort, das wir geschrieben haben, ein Anagramm in der Liste hat, die wir gerade geschrieben haben. Folgend? :) \t \t jetzt bekomme ich so: Schreibe eine Wörterliste: älg lag gäl hej lol Danke! Geben Sie einen der Wörter für Anagramm zu überprüfen: Anagramme: älg gal alle So jsut nur ein Wort statt wir – Hippimaster

1

Dies ist, wie Sie die Benutzereingabe lesen angeben:

static void Main(string[] args) 
{ 
    Console.WriteLine("Write a list of Words"); 
    string input = Console.ReadLine(); 
    List<string> words = input.Split(' ').ToList(); 
    List<string> result = new List<string>(); 
    bool match = false; 

dies sollte führen:

enter image description here

+0

Dank vergleichen verwenden erscheint! Das löst einen Teil meines Problems. Man bleibt noch. Die Anagramm-Überprüfung sollte nicht direkt nach der Liste angezeigt werden. Ich möchte der Benutzer eines der Wörter schreiben sie in der Liste nur geschrieben und dann sollte das Programm überprüfen, ob das letzte Wort haben wir ein Anagram in der Liste schrieben wir gerade geschrieben haben. Folgend? :) – Hippimaster

+0

jetzt bekomme ich so: Schreibe eine Wörterliste: älg lag gäl hej lol Danke! Geben Sie eines der folgenden Wörter ein, um nach Anagram zu suchen: Anagramme: älg gäl Also erscheint alles jsut anstatt nur ein Wort, das wir verwenden, um zu vergleichen – Hippimaster

0

ich einen dictionar mit empfehlen y (oder lookup) anstelle von Liste und alle Anagramme mit dem gleichen Schlüssel gruppieren. Taste Buchstaben innerhalb des Wortes sortiert (so haben wir "amr" nach 'R' Sortierung, 'a', 'm' in der ' "RAM"' und Wert ist der Satz von Anfangs Wörter)

amr: {mar, arm, ram} 
    egl: {Elg, gel} 

The imlementation

private static string MakeKey(string value) { 
    return string.Concat(value 
     .Select(c => char.ToUpper(c)) // let's be case insensitive 
     .OrderBy(c => c)); 
    } 

    private static void AddWord(Dictionary<string, HashSet<string>> words, string word) { 
    string key = MakeKey(word); 

    HashSet<string> anagrams; 

    if (words.TryGetValue(key, out anagrams)) 
     anagrams.Add(word); 
    else 
     words.Add(key, new HashSet<string>() {word});    
    } 

    static void Main(string[] args) 
    Dictionary<string, HashSet<string>> words = new Dictionary<string, HashSet<string>>(); 

    // Let user input all the words separating them either by spaces or by commas etc. 
    var initialWords = Console 
     .ReadLine() 
     .Split(new char[] { ' ', ',', ';', '\t' }, StringSplitOptions.RemoveEmptyEntries); 

    foreach (var word in initialWords) 
     AddWord(words, word); 

Wörterbücher sind viel effizienter O(N) v. O(N**2) bei großen Wort-Arrays (was ist, wenn Sie die gesamte schwedische Vokabular analysieren wollen?). Um Anagramme zu erhalten, sollten wir die Paare aus dem Wörterbuch s.t. mindestens zwei Worte in Value enthalten:

var report = words 
    .Where(pair => pair.Value.Count > 1) // at least 2 words share the same key 
    .Select(pair => string.Join(", ", pair 
     .Value 
     .OrderBy(item => item))) // let us be nice and ordering anagrams 
    .OrderBy(item => item); // let us be nice and ordering anagrams 

    Console.Write(string.Join(Environment.NewLine, report)); 

Das Ergebnis ist

arm, ram 
    Elg, gel 
    era, rea 
    för, frö 
0

Dankbar für die Antworten so weit! Ich denke, meine Erklärung des Problems war ein wenig zu schwach. Die Benutzereingabe ist jetzt behoben ABER das letzte Problem bleibt bestehen. Nachdem der Benutzer seine Eingabe geschrieben hat, erhalten sie eine weitere Frage "Geben Sie eines der Wörter in die Liste ein, um nach Anagrammen zu suchen?" Aber mein Problem ist, dass mein Programm alle meine Anagramme ausführt und nicht nur das Wort, das wir in der zweiten Frage ausgewählt haben. :/

Verwandte Themen