javascript - ক্রম সংখ্যায় বাছাই করা ক্রমে তবে শুরুতে `0` গুলি সহ




arrays sorting (7)

অ্যারেটিকে আরেকবার বাছাই করে চেষ্টা করুন:

let arr = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5];

arr.sort((x, y) => {
    return y > x ? 1 : -1;
}).sort((x, y) => {
    if (x === 0) { return -1; } return 0;
})

জাভাস্ক্রিপ্টে আমার একটি চ্যালেঞ্জ রয়েছে যা আমি ইতিমধ্যে কিছু সময়ের জন্য বের করার চেষ্টা করছি।

এই অ্যারে বিবেচনা করুন:

let arr = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5];

আমি এই ফলাফল আউটপুট দিতে হবে:

arr = [0, 0, 0, 0, 0, 5, 4, 3, 2, 1]

আমি সূত্রের মানটি সামঞ্জস্য করে সামনে শূন্যগুলি অবস্থানের জন্য এই যুক্তিটির লাইনটি অনুসরণ করছি:

arr.sort((x, y) => {
    if (x !== 0) {
        return 1;
    }

    if (x === 0) {
        return -1;
    }

    return y - x;
});

তবে আমি এই ফলাফলটিতে আটকে আছি:

arr = [0, 0, 0, 0, 0, 1, 2, 3, 4, 5]

এটি সমাধান করার জন্য কারও কাছে কি কোনও টিপস রয়েছে?


আপনার তুলনা ফাংশনটির শর্তটি কেবল এর মতো পরিবর্তন করুন -

let arr = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5];
arr.sort((a, b) => {
     if(a && b) return b-a;
     return a-b;
});

console.log(arr);


আপনি b এবং a এর ডেল্টা অনুসারে বাছাই করতে পারেন (সাজানোর জন্য সাজানোর জন্য) এবং শূন্যের মতো মিথ্যা মানগুলির জন্য সংখ্যা। MAX_VALUE নিতে পারেন।

এই:

Number.MAX_VALUE - Number.MAX_VALUE

শূন্য সমান।

let array = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5];

array.sort((a, b) => (b || Number.MAX_VALUE) - (a || Number.MAX_VALUE));

console.log(...array);


আপনি এটি এইভাবে করতে পারেন:

let arr = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5];

let result = arr.sort((a,b) => {
  if(a == 0 || b == 0)
    return a-b;
  return b-a;
})
console.log(result)

অথবা আপনি এটি করতে পারেন:

let arr = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5];

let result = arr.sort().sort((a,b) => {
  if(a > 0 && b > 0)
    return b-a
  return 0
})

console.log(result)


এখানে কোড গল্ফ খেলছে না:

let arr = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5, -1];
arr.sort(function(a, b) {
  if (a === 0 && b !== 0) {
    // a is zero b is nonzero, a goes first
    return -1;
  } else if (a !== 0 && b === 0) {
    // a is nonzero b is zero, b goes first
    return 1;
  } else {
    // both are zero or both are nonzero, sort descending
    return b - a;
  }
});
console.log(arr.toString());


নতুন সমাধানের প্রস্তাব দেওয়ার পরিবর্তে (ইতিমধ্যে এখানে বেশ কয়েকটি রয়েছে), আমি কেবল নিজের সাথে ত্রুটিগুলি ব্যাখ্যা করতে চাই।

যখন তুমি কর:

if (x !== 0) {
    return 1;
}
if (x === 0) {
    return -1;
}

আপনি প্রতিটি সম্ভাব্য পরিস্থিতি আবরণ করছেন! সুতরাং, return y - x কখনই পৌঁছায় না। আমরা সহজেই প্রমাণ করতে পারি যে ( console.log বার্তাটি প্রদর্শিত হবে না):

arr = [0, 0, 0, 0, 0, 5, 4, 3, 2, 1]

arr.sort((x, y) => {
  if (x !== 0) {
    return 1;
  }
  if (x === 0) {
    return -1;
  }
  console.log("I will never show up")
  return y - x;
});

অতএব, এটি আপনার কোডের সর্বাধিক নিকটতম রাখা, এটি হওয়া উচিত:

arr = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5];

arr.sort((x, y) => {
  if (x === 0) {
    return -1;
  }
  if (y === 0) {
    return 1;
  }
  return y - x;
});

console.log(arr)

আপনি দেখতে পাচ্ছেন যে আপনার কোড থেকে পার্থক্যটি কেবলমাত্র 1 টি অক্ষর ( ! থেকে = ), সুতরাং এখন আমরা তুলনা শূন্য হওয়ার যে কোনও একটির জন্য পরীক্ষা করছি।


যেমন এমডিএন ডকস বলেছেন:

যদি ক এবং খ দুটি উপাদান তুলনা করা হয়, তবে:

compareFunction(a, b) যদি 0 চেয়ে কম প্রত্যাবর্তন করে তবে compareFunction(a, b) চেয়ে কম compareFunction(a, b) সাজান (অর্থাত্ প্রথমটি আসে)।

compareFunction(a, b) 0 দেয়, তবে একে এবং অন্যকে সম্মানের সাথে অপরিবর্তিত রাখুন, তবে সমস্ত ভিন্ন উপাদানের সাথে compareFunction(a, b) সাজানো হয়েছে। দ্রষ্টব্য: ইসিমাস্ক্রিপ্ট স্ট্যান্ডার্ডটি এই আচরণের গ্যারান্টি দেয় না, এইভাবে সমস্ত ব্রাউজারই নয় (উদাহরণস্বরূপ মজিলা সংস্করণ কমপক্ষে 2003 এর পুরানো) এটি সম্মান করে।

compareFunction(a, b) যদি 0 এর চেয়ে বেশি ফেরত দেয় তবে b চেয়ে কম সূচীতে বাছাই করুন (যেমন b প্রথম আসে)।

compareFunction(a, b) এর দুটি আর্গুমেন্ট হিসাবে একটি নির্দিষ্ট জোড় উপাদান এবং b দেওয়া হলে অবশ্যই সর্বদা একই মানটি ফেরত দিতে হবে। যদি অসঙ্গতিপূর্ণ ফলাফলগুলি ফিরে আসে, তবে সাজানোর ক্রমটি সংজ্ঞায়িত।

সুতরাং, তুলনা ফাংশন নিম্নলিখিত ফর্ম রয়েছে:

function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

let arr = [0, 1, 0, 2, 0, 3, 0, 4, 0, 5];

arr.sort((x, y) => {
    if (x > 0 && y > 0) {
        return y - x;
    }
    return x - y;
});

console.log(arr);








sorting