質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • JavaScript

    17492questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jQuery

    7101questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

最初からn文字が一致する行を削除するプログラムが上手く動かない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 688

cloudspider

score 79

入力した数字をnとして
行の最初からn文字が一致する行全体を削除して、重複をなくしたものを表示するプログラムを作ろうとしていたのですが、どうやっても上手く行きません。

上のテキストエリアにを入力すると,左下に重複を消した全ての行列(重複2個なら1個に、重複が5個なら1個にした行列)が表示され、
右側には重複したものをすべて表示するようにしたいです。

例えば最初の行数がN行だとして
m(<N)番目の最初のn文字と、

m+2(<N),m+5(<N)の最初のn文字が重複している時、
のように1つの行に対して、重複行が他に2つ以上あるとおかしくなります。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <script src="http://code.jquery.com/jquery-latest.js"></script>
  <title>pasword generator</title>
</head>
<style>
  textarea {
    outline: none;
    border: 1px solid #aaa;
    -webkit-transition: all .3s;
    transition: all .3s;
  }
  textarea:focus {
    box-shadow: 0 0 7px #1abc9c;
    border: 1px solid #1abc9c;
  }
  #inputNum {
    outline: none;
    border: 1px solid #aaa;
    -webkit-transition: all .3s;
    transition: all .3s;
  }
  #inputNum:focus {
    box-shadow: 0 0 7px #1abc9c;
    border: 1px solid #1abc9c;
  }
  #input {
    margin-top: 10px;
  }
  #button {
    width: 100px;
    font-size: 20px;
    background-color: #333;
    border: 2px solid #333;
    color: #fff;
    line-height: 50px;
    transition: all .3s;
  }
  #button:hover {
    background-color: #fff;
    border-color: #1abc9c;
    color: #1abc9c;
  }
  .box,.box2 {
    display: none;
  }
</style>
<body>
  <div>
    <span>最初からn文字が一致する行を削除.</span>
    <input type="text" id="inputNum">
  </div>

  <div><textarea id="input" cols="100" rows="40"></textarea></div>
  <div><input id="button" type="button" value="変 換"></div>
  <textarea id="output" cols="100" rows="40"></textarea>
  <textarea id="output2" cols="100" rows="40"></textarea>
  <div class="box"></div>
  <div class="box2"></div>

  <script>
  (function(){
    'use strict';

    $('#button').click(function(){
      var textn = $('#input').val().replace(/\r\n|\r/g, '\n');
      var lines = textn.split('\n'); //line配列に格納

      var firstNChars = parseInt($('#inputNum').val());
      var lineFirstChars=[]; //先頭n文字の配列

      var rightArray = []; //重複したものを1つずつ

      for(var i=0; i<lines.length; i++){
        lineFirstChars.push(lines[i].slice(0,firstNChars));//先頭n文字の配列
      }

      for(var j=0; j<lines.length; j++){
        for(var k=j+1; k<lines.length-j-1; k++){
          if(lineFirstChars[j] == lineFirstChars[k]){
            rightArray.push(lines[k]);
            lines.splice(k, 1);
            k--;
          }
        }
      }

      var text2 = "";
      for(var i=0; i<lines.length; i++){
        $('.box').text(lines[i]);
        var text =$('.box').text().replace(/\"],/g,'\"],\n');
        text2 = text2 + text;
      }
      $('#output').text(text2);

      var text4 = "";
      for(var i=0; i<rightArray.length; i++){
        $('.box2').text(rightArray[i]);
        var text3 =$('.box2').text().replace(/\"],/g,'\"],\n');
        text4 = text4 + text3;
      }
      $('#output2').text(text4);
    });
  })();
  </script>
</body>
</html>

この辺が間違っている気がしています。

 for(var j=0; j<lines.length; j++){
        for(var k=j+1; k<lines.length-j-1; k++){
          if(lineFirstChars[j] == lineFirstChars[k]){
            rightArray.push(lines[k]);
            lines.splice(k, 1);
            k--;
          }
        }


ifが満たされた時に
spliceを使うことで、配列linesの要素数が減り、その影響で、for文の挙動が少しおかしくなり、なんらかのkが飛ばされているのではないかと思っています。

sliceの他にdeleteして
$.grep(hoge, function(e){return e !== "";});
を実行してみたりしたのですが、上手く行きませんでした。

データの形式は、配列の形です。
例として、以下のサイトにデータを置いておきます。
http://marumaru.tonkotsu.jp/%E6%9C%80%E5%88%9D%E3%81%8B%E3%82%89n%E6%96%87%E5%AD%97%E3%81%8C%E4%B8%80%E8%87%B4%E3%81%99%E3%82%8B%E8%A1%8C%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0

「var jouhou=」以下をまるまるコピペしてテキストエリアにぶちこんで変換を押しても上手く行ってないことがわかります。

何でこんなことをしたいのかというと、この4つの配列の[n][0]の英数字の羅列が授業コードなのですが、これの重複を防ぎたいのです。
ところが授業コードが同じにも関わらず[n][8]のリンクの最後の英数字が異なるので、
「行重複削除ツール」なるものがネット上にあるのですが、行がまるまる一致しているわけではないので、それが使えないのです。

どなたか間違いがわかる方がいらっしゃればご教授願います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

こんな感じでいけるかな?

<div>
    <span>最初からn文字が一致する行を削除.</span>
    <input type="text" id="inputNum" value="2">
</div>
<div><textarea id="input" cols="100" rows="40">12345
123896
158746
115586
15786x
123546
887764
</textarea></div>
<div><input id="button" type="button" value="変 換"></div>
<textarea id="output" cols="100" rows="40"></textarea>
<textarea id="output2" cols="100" rows="40"></textarea>
<div class="box"></div>
<div class="box2"></div>
jQuery( function() {
    'use strict';
    $( '#button' ).click( function() {
        const lines = $( '#input' ).val().replace( /\r\n|\r/g, '\n' ).split( '\n' ); //line配列に格納
        const firstNChars = parseInt( $( '#inputNum' ).val(), 10 );
        let lineFirstChars = []; //先頭n文字の配列
        let resultArray = []; // 結果
        let deleteItems = []; // 削除したもの

        for ( let i = 0; i < lines.length; i++ ) {
            lineFirstChars.push( lines[ i ].slice( 0, firstNChars ) ); //先頭n文字の配列
        }

        for ( let j = 0, l = lineFirstChars.length; j < l; j++ ) {
            let item = lineFirstChars[ j ], flag = true;
            for ( let k = j - 1; k >= 0; k-- ) { // jより前に重複が無いか探索
                if ( item == lineFirstChars[ k ] ) {
                    deleteItems.push( lines[ j ] );
                    flag = false; // 結果から除外
                    break;
                }
            }
            if ( flag && lines[ j ] ) { // 重複と空行を除外
                resultArray.push( lines[ j ] ); // 結果に追加
            }
        }
        $( '#output' ).val( resultArray.join( '\n' ) );
        $( '#output2' ).val( deleteItems.join( '\n' ) );
        $( '.box' ).html( resultArray.join( '<br>' ) );
        $( '.box2' ).html( deleteItems.join( '<br>' ) );
    } );
} );

動くサンプル:https://jsfiddle.net/xjkrxdtp/1/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

未検証ですが。

function findUniqueLine (string, startWidth) {
  return string.split(/\r\n|[\n\r]/).filter(function (line) {
    var startString = line.slice(0, startWidth);

    if (this.indexOf(startString) !== -1) {
      return false;
    }

    this.push(startString);
    return true;
  }, []);;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • JavaScript

    17492questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • jQuery

    7101questions

    jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。