2009-12-01 14 views
2

J'ai ce petit morceau de code.Collecter tout ne pas en utilisant Ruby

Je ne sais pas ruby ​​et je pense que c'est une excellente occasion de l'appliquer.

Je veux imprimer toutes les lignes dans le fichier e qui ne sont pas dans le fichier c. Chaque ligne est un nombre.

C'est ce que j'ai:

e = File.new('e').readlines 
c = File.new('c').readlines 

x = e.collect do |item| 
    c.include?(item) ? "" : item 
end 

p x.sort 

Le problème est que les deux fichiers peuvent avoir des espaces vides et pour cette raison le même nombre ne peut pas être considéré comme tel. (par exemple "1234" est différent de "1234")

De quoi ai-je besoin dans mon code pour le réparer? J'ai essayé c.include?(item.strip) .. .mais ne semble pas fonctionner.

Répondre

3

Peut-être faire le strip quand vous faites le readlines contribuerait, à savoir

e = File.readlines('e').map{|x| x.strip} 
c = File.readlines('c').map{|x| x.strip} 

Ensuite, vous pouvez utiliser collect comme vous l'avez fait, ou peut-être select si vous ne voulez pas les chaînes vides:

x = e.select{|i| !c.include?(i)} 

Modifier: ou Benno suggère, utiliser

x = e-c 
+1

En fait, x = e - c devrait fonctionner aussi bien – Benno

+0

e-c? .. agréable ... – OscarRyz

1

Vous pouvez convertir les éléments en nombres réels. De plus, vous devriez fermer ces fichiers après les avoir lus. File.new s'ouvre mais ne se ferme pas. Vous pouvez l'ouvrir dans un bloc pour le fermer automatiquement. Essayez:

e = nil 
c = nil 
File.open('e'){|file| 
    e = file.readlines 
    e.map!{|x| x.to_i} 
} 
File.open('c'){|file| 
    c = file.readlines 
    c.map!{|x| x.to_i} 
} 

Pour créer les tableaux de nombres.

3

Deux choses:

  • vous pouvez utiliser l'opérateur moins pour les jeux
  • pourquoi ne pas convertir en entiers si chaque ligne est un entier?

    File.readlines("e").map(&:to_i) - File.readlines("c").map(&:to_i) 
Questions connexes