0

小さなアルゴリズムを作成し、javascript を使用して実装したいと考えています。これが私のアルゴリズムです

data.jsonこの形式のファイルにデータがあります

[
"109 200",
"109 201",
"102 202",
"103 202"
]

私がやろうとしていることは

  1. c1、c2、c3、c4 の 4 つの配列コンテナーを作成します。
  2. 上記データをそのままc1コンテナに入れる
  3. c1 をループし、データを次の形式で c4 に入れます

    "109",
    "200",
    "109",
    "201",
    "102",
    "202",
    "103",
    "202"
    
  4. c1 をループし、この形式で c2 に入れます

    "109,200"
    
  5. 次に、c3 が空かどうかを確認し、c2 から最初の値を読み取り、それを c3 にプッシュします。

  6. 手順 4 を繰り返しますが、今回はこの形式で c2 の c1 からの 2 番目のデータ、つまり「109 201」を入れます。

    "109,201"
    
  7. 次に、c3 が空でないかどうかを確認し、c2 をループして、これら 2 つの値のいずれかが c4 で繰り返されているかどうかを確認します。繰り返される場合は、data.json から最小量の数値が見つかるまで、手順 6 と 7 を繰り返します。

このアルゴリズムは効率的ではありませんが、それでもこれを使用したいと考えています。

これが私のコードです。

var teams = [],
    c1 = [], arr = [], left = [], right = [], j = 0,
    show = function () {
        var span = $('#list');

        $.getJSON('data/data.json', function (ids) {

            //c1.push(c);
            for (var i = 0; i < ids.length; i++) {
                var a = smallcontainer(ids);
                var b = bigcontainer(ids);
                var c;

                if (c1 == "") {
                    c = a[0].split(" ");
                    console.log(c);
                } else {

                }


                //console.log(c);
                var id = ids[i];
                teams = id;
                $('<li>' + id + '</li>').appendTo(span);
            }
        });
    },

    smallcontainer = function (teams) { //arr
        arr = [teams[j]];
        j++;
        return arr;
    },

    bigcontainer = function (ids) { //c3. in code it is left+right=result
        for (var i = 0; i < ids.length; i++) {
            var splitted = ids[i].split(" ");
            left.push(splitted[0]);
            right.push(splitted[1]);

        }
        var result = left.concat(right);
    };

アップデート

data.json ファイル内のデータには、次の形式で各チームに 2 人のメンバーを持つ 4 つのチームがあります。

"109 200" = Team 1
"109 201" = Team 2
"102 202" = Team 3
"103 202" = Team 4

そのため、最小人数を計算する必要があり、このリストから各チームから 1 人のメンバーを選択して、ID を表示する必要があります。したがって、上記の出力は次のようになります

109
202

最新のアップデート

私はまだ助けを待っています

解決

これは、AlexBell と PAEz の助けを借りたソリューションです。以下のソリューションを使用しましたが、これは基本的にAlexBellによって解決されました

var data = [
 "1009 2000", 
 "1009 2001", 
 "1002 2002", 
 "1003 2002", 
 "1004 2003", 
 "1005 2004", 
 "1006 2005", 
 "1007 2006", 
 "1007 2007", 
 "1008 2008", 
 "1009 2008", 
 "1010 2009", 
 "1011 2010", 
 "1012 2010"      
];

var first = [], second = [], result = {}, out = '';

//Separe the ids
for(var i = 0; i < data.length; i++){
    var el = data[i].split(' '); 
    first[i] = el[0];
    second[i] = el[1];
}

for(var k = 0; k < first.length; k++){

    //Count the elements
    var nOfFirst = countElemnts(first, first[k]);
    var nOfSecond = countElemnts(second, second[k]);

    //If the first is in more that second take it
    if(nOfFirst > nOfSecond){
        result[first[k]] = 0;
    //Else take the second        
    }else if(nOfFirst < nOfSecond){
        result[second[k]] = 0;
    //If is only one take it    
    }else{
        result[first[k]] = 0;
    }

}

function countElemnts(arr, el){
    var count = 0;
    for(var j = 0; j < arr.length; j++){
        if(arr[j] == el)
            count++;
    }
    //console.log(el+' : '+count);
    return count;
}

for(var n in result){
    out += 'The id n: '+n+' is in the list\n';
}

alert(out);
4

1 に答える 1

2

これは機能しますか?...

var teams=[
"109 200",
"109 201",
"102 202",
"103 202"
];

var members ={};

var matesId='109';

// Members that won
var wins={};

// First lets find out how many teams a member is in
for (var i=0,length=teams.length; i<length;i++){
  var temp = teams[i].split(' ');
  for (var z=0,zlength=temp.length;z<zlength;z++){
    if (!members[temp[z]]) members[temp[z]]={wins:0,totalTeams:0,id:temp[z]};
      members[temp[z]].totalTeams=members[temp[z]].totalTeams+1;
  }
    teams[i]=[members[temp[0]],members[temp[1]]];
}

for (var i=0,length=teams.length; i<length;i++){
  var member1=teams[i][0];
  var member2=teams[i][1];
  if (member1.totalTeams>member2.totalTeams){
    member1.wins=member1.wins+1;
  } else if (member1.totalTeams<member2.totalTeams){
    member2.wins=member2.wins+1;
  } else {
    member1.wins=member1.wins+1;
    member2.wins=member2.wins+1;
  }    
}

for (var i=0,length=teams.length; i<length;i++){
  var member1=teams[i][0];
  var member2=teams[i][1];
  if (member1.wins>member2.wins){
    if (wins[member2.id]!==true) wins[member1.id]=true;
  } else if (member1.wins<member2.wins){
    if (wins[member1.id]!==true) wins[member2.id]=true;
  } else if (!wins[member1.id] && !wins[member2.id]) {
    if (member1.id==matesId && member2.id==matesId) {
      wins[matesId]=true;
    } else{
     // A draw, so pick one
      Math.round(Math.random())==1 ? wins[member2.id]=true : wins[member1.id]=true;
    }
  }    
}

var keys=Object.keys(wins);
var results=[];
results.push(keys.length);
for (var i=0,length=keys.length; i<length;i++){
  results.push(keys[i]);
}
results=results.join('\n');
document.querySelector('#output').innerText=results;​

http://jsfiddle.net/PAEz/dLUqj/3/
編集: 少し読みやすいように更新しました。
編集: 引き分けて勝つ必要はないことに気付きました。ただ勝つだけで十分です。
最終編集: 1 つの小さなエラーに気付きました。今はすべて問題ないはずです。

于 2012-08-16T14:53:58.017 に答える